質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1478閲覧

phpでPOST送信した後の、取得後のURLを取得する方法について

ebsffzal

総合スコア107

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/10/23 01:44

皆様

お世話になっております。

今、PHPでPOST送信する処理を書いています。

その際に、POST送信した後に取得できるデータから
URLを取得しようとしていますが、技術的に可能なのかどうか、
お知恵を拝借させていただきたいと思います。

■動作環境
LAMP環境(php5.6)

■コード

php

1$url = "http://hogehoge.fuga.com/hoge"; 2$data = array( 3 'post_id' => '1234', 4 'download_type' => 'abcd' 5); 6$content = http_build_query($data); 7$options = array('http' => array( 8 'method' => 'POST', 9 'content' => $content 10)); 11$contents = file_get_contents($url, false, stream_context_create($options)); 12

上記のコードを実行し、「$contents」をvar_dumpすると、バイナリデータ(この場合取得先のPDFデータ)が入ってくるのですが、このPDFはブラウザでアクセスしても見ることができます。

■実現したいこと
上記のプログラム結果から、「ブラウザアクセス時のURL」を取得したい

■試したこと
var_dumpの結果を元に、URLを取得しようとしましたが、
手がかりになるものが無く、途方にくれています。

上記のfile_get_contentsをする際、取得先のURLを取得することについて
お教えいただけますでしょうか。
どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/10/23 01:53

ブラウザアクセス時のURLってどういうことなのでしょうか?リファラーのことですか?
masaya_ohashi

2017/10/23 02:00

それをブラウザ側で取得したい、ということでしょうか?
ebsffzal

2017/10/23 02:03

masaya_ohashi様 実行時はphpをコマンドラインで動かしていますので、phpプログラム側で取得したいです。手動でPOST(画面のボタン押下)すればブラウザ側のURLと表示結果が出力されるのは確実なので、それと同じことをコマンドラインで行いたいです。
masaya_ohashi

2017/10/23 02:06

file_get_contents実行時のリダイレクト先のURLがPHPコード上で欲しい、ということですか?
ebsffzal

2017/10/23 02:07

masaya_ohashi様 はい。まさにその動作になります!
guest

回答1

0

ベストアンサー

httpやhttpsで始まるURLに対しfile_get_contentsを実行すると、$http_response_headerという変数に自動でレスポンスヘッダが格納されています。$http_response_headerは配列で、その中にレスポンスヘッダが1行ずつ入っているはずです。リダイレクトされたリクエストである場合、そのレスポンスヘッダにはLocationというヘッダが含まれていると思います。

php

1$contents = file_get_contents($url, false, stream_context_create($options)); 2 3foreach($http_response_header as $index => $header) { // レスポンスヘッダを1行ずつ探す 4 if(preg_match('/^Location: (.*?)$/', $header, $match)){ // Location:で始まるヘッダを見つける 5 $redirectUrl = $match[1]; // マッチ結果の1つめのグループがリダイレクト先のURLにあたる 6 } 7}

投稿2017/10/23 02:14

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebsffzal

2017/10/23 02:20

masaya_ohashi 様 すごすぎます・・・! できました!! 「$http_response_headerという変数に自動でレスポンスヘッダが格納されて」 という部分が当方の知識として無かったので、途方にくれていました。 完全に勉強不足を痛感しました。 まだサンプルプログラムで確認しただけですが、実際のプログラムに実装してみたいと思います。 この短時間で的確なご回答を大変ありがとうございました!
masaya_ohashi

2017/10/23 02:31

ちなみに私も知りませんでした。「リダイレクトされた情報はレスポンスヘッダにある」ということは知っていましたが、「あれ?file_get_contentsってレスポンスヘッダ受け取るにはどうすればいいんだ?」という流れでこの情報に至りました。
ebsffzal

2017/10/23 02:39

masaya_ohashi 様 そうだったのですね…それにしても原因追求への道筋がスマートで素晴らしいと思いました! また、本稼動のプログラムでも動作させたところ、 「file_get_contents(): Content-type not specified assuming application/x-www-form-urlencoded」 というエラーになったので、 $headers = array( 'Content-Type: application/x-www-form-urlencoded', 'Content-Length: '.strlen(http_build_query($data)) ); を追記し、$optionsのパラメータに「'header' => implode("\r\n", $headers)」と記載することでエラーは無くなり、無事に目的の値(URL)を取得することができました。 大変助かりました。ありがとうございました!
masaya_ohashi

2017/10/23 02:57

どつぼにハマった時は「一体自分は何に困っているのか」を分析する力が必要になります。細かく事象を分解できれば、個々の情報はたいていネットに転がっているものです。私は幸いそういったシーンを客観的に解決する業務が無数にあったので身につきました。精進あるのみです。
ebsffzal

2017/10/23 03:20

masaya_ohashi 様 そうですね。問題をいかに解くか、は技術スキルと並行して伸ばしたいです。 ここで質問するほうが多いので、回答する側になれるよう精進いたします。 解決の数を増やすことで力をつけたいと思います。 この度は誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問