• 締切済み

HTTP通信の詳細を知りたい

PHPで他ドメインのページの情報を取得しています。 その際に、HTTP通信のリクエストヘッダ、レスポンスヘッダの詳細を見たいです。 イメージとしては、firefoxの「firebug」とか「live http header」で取得できる情報量がほしいです。 現在、http通信でhttp_clientを使っています。 http_clientのcurrentResponse()でレスポンスは取得できるのですが、 クッキー情報などが入っていないです。 一番知りたいのは、リクエストヘッダです。 PHPを設置しているサーバーからどのようなリクエストヘッダを送っているのかを知りたいです。 というのは、設置しているサーバーによって同じページにリクエストを送っているのに、返ってくる情報が変わるときがあります。 PHPプログラムは全く同じです。 サーバーはさくらインターネットの共有サーバーを3つ契約しており、 3つのサーバーに同じプログラムを置いてHTTP通信しているのですが、 取得できる情報が異なっていて困っています。 恐らく、リクエストの何かが違っていると思うのでそれを調べたいと思って 質問しました。 そもそも原因が違うところにありそうであればアドバイスもお願いします。 よろしくお願いします。

  • macus
  • お礼率76% (331/433)
  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

noname#244856
noname#244856
回答No.1

HTTP_Clientにそこまでの機能が実装されていないのであれば別の方法を検討しなければなりません。 一番原始的な方法が、fsockopen関数やstream_socket_client関数で作成したコネクションリソースを使って、リクエストヘッダの書き込みやレスポンスヘッダとレスポンスボディの読み取りを行っていく方法です。 PHP Manual - fsockopen ・通常接続 → ホスト名をそのまま使う ・SSL接続 → ホスト名に ssl:// を付加する http://us3.php.net/manual/ja/function.fsockopen.php PHP Manual - stream_socket_client ・通常接続 → ホスト名に tcp:// を付加する ・SSL接続 → ホスト名に ssl:// を付加する ・非同期接続に対応 http://us3.php.net/manual/ja/function.stream-socket-client.php 特に拘りが無ければfsockopenでいいと思います。手順としては以下のようになります。 1. fsockopenでリソースを作成して接続 2. fwriteでリクエストヘッダーを書き込む(改行コードは\r\n) 3. stream_get_contentsでレスポンスヘッダとレスポンスボディを読み込む(初めて\r\n\r\nが出現する場所で分割する) コードにするとこんな感じでしょうか。リクエストヘッダは最後に\r\n\r\nが出現するように空行を入れて調整してください。 if ($fp = @fsockopen('example.com', 80)) {  fwrite($fp, implode("\r\n", array(   'GET /index.php HTTP/1.1',   'Host: example.com',   'Connection: close',   '',   '',  )));  list($header, $body) =   explode("\r\n\r\n", stream_get_contents($fp), 2)   + array(1 => ''),   ;  var_dump($header, $body);  fclose($fp); } else {  $error = error_get_last();  die('Error: ' . $error['message']); } 「HTTP通信の内容を覗きたいっていったじゃん!」 「代わりの方法なんて聞いてねーよ!」 って思われるかもしれませんが、HTTP_Clientが内部で使用しているNet_Socketクラス内で「fsockopen」「pfsockopen」「stream_socket_client」といった関数が使われているのを確認しました。内部的にやってることは同じなんです。 つまりインストールされているPEARに探りを入れれば送出する内容を見ることが可能です。fwriteされているものをvar_dumpするという感じで。

macus
質問者

お礼

詳細な回答ありがとうございます。 すごく助かります。 >「HTTP通信の内容を覗きたいっていったじゃん!」 >「代わりの方法なんて聞いてねーよ!」 全然思ってません^^

関連するQ&A

  • HTTPリクエスト

    JSPのクライアントからサーブレットにHTTPリクエストを送信する部分について、質問させていただきたく思います。 [実現したいこと] ・クライアント側からのHTTPリクエストのヘッダの内容を、任意のものに書き換えてサーブレットに送信。 [環境] WEB APサーバー:Web Sphere Aprication Server HTTPヘッダを読み取って、ヘッダ内のクライアント情報を元にクライアント別の処理を振り分ける機能を作ったのですが、そこの機能をテストするのに上の機能を使いたいと思ってます。。。 皆様のお知恵を拝借できればと思います。 よろしくお願いいたします。

  • HTTPのExpiresヘッダーについて教えてください。

    HTTPのExpiresヘッダーについて教えてください。 画像が多いサイトを運営していて、リクエストの数を減らすためにExpiresヘッダーを追加しました。 僕の予想としては、一度キャッシュされればCache-Controlのmax-ageの期間はリクエストが上がらないと思っておりました。 実際、FirefoxのFirebugで確認をするとリフレッシュするたびにリクエストが飛んでいました。 WebサーバはIISを使用しており、EtagとExpiresが両方レスポンスされていたので優先順位の問題かと思いApacheでEtagを出さない設定にして試してみても同じ状況になってしまいます。 僕の理解としてはExpiresとCache-Controlを付ければ、有効期限の間はキャッシュを使用してリクエストは飛ばないと思っていました。 調査するにも行き詰まっており、何かヒントがいただければと思います。 よろしくお願いいたします。

  • perlでHTTP Request Headersの情報を取得、表示す

    perlでHTTP Request Headersの情報を取得、表示するページを作成したい 当方初心者です。 apache上のCGI(perl)で、ブラウザから受け取った HTTP Request Headersの情報を取得、出力するページを作成したいのです。 調べると下記のようなサーバ環境変数の取得、表示方法は多数ヒットするのですが =================================================== #!/usr/bin/perl -- print << "DOC1"; Content-type:text/html\n\n <HTML><BODY> DOC1 print $ENV{'HTTP_USER_AGENT'}<br>\n"; print $ENV{'REMOTE_ADDR'}"; print << "DOC2"; </BODY></HTML> DOC2 =================================================== 今回は、環境変数からではなく、HTTP Request Headersから 直接ヘッダに格納された情報を取得したいのです 取得・表示したい情報は標準HTTPヘッダ情報に加え、 途中で経由するプロキシが追加するヘッダ情報です。 完成イメージとしては PHPの<? phpinfo() ?>で出力できる 添付画像にあるような形なのですが どのようにすればできるのでしょうか サンプルの形で教えて頂けると助かります 参考になるページでも結構です よろしくお願いします

  • HTTPリクエスト・レスポンスヘッダとは?

    こんにちは。お世話になります。 HTTPリクエストヘッダとレスポンスヘッダは通信において、HTMLファイルの前に送られてきて、その後HTMLファイルが送られてくる、と聞いているのですが、HTMLファイルの<HEAD></HEAD>タグの間に書く、<META ~>の情報とは、別物なんでしょうか? 別物だとしたら、<META ~>はどういう意味をなすのでしょうか? 誰か分かる方が見えましたら、教えてください。よろしくお願いします。

  • HTTPヘッダの取得方法

    PerlにてHTTPヘッダの情報を取得したいと考えています。 通常ならば、 $ENV{'<ヘッダ名称>'} で取得できるはずなのですが、 今回取得しようとしているヘッダはHTTPの標準ヘッダではありません。 proxyサーバにてログインを行い認証されますと、 そのproxyサーバが独自にHTTPヘッダに値を追加する仕様になっています。 テストではJavaですとproxyが設定したヘッダ情報を取得できるのですが、 ことPerlになると取得することができません。 ※Javaと今回動かすPerlは同一サーバで動かします。 HTTP標準以外のヘッダ情報はどのように取得すれば良いのでしょうか? なお、PerlのVerは5.6.1、OSはLinuxです。

  • HTTPで通信するソフト

    質問させていただきます。 HTTPで通信するソフト(クライアント側)を作りたいのですが、私は組込み系のソフトしか作ったことがなく、ネットワーク系は初めてだったので、プロトコルの勉強から始めました。TCP/IPは理解し、HTTPの仕様がRFCというもので文書化されているのは分かったのですが、RFCには数が多く、HTTPの仕様も膨大にあるように感じました。 HTTPで通信するソフトを作る人はどうやって仕様を把握し、ソフトを作っているのでしょうか?私は何が必要で、何が必要でないのか判断が付かない状況です。 特にヘッダーフィールドは数が多く、理解が大変で困っています。 (世の中のHTTPクライアントはHTTPの全ての仕様を守っているのでしょうか?) よろしくお願い致します。

  • HTTPリクエストヘッダーの設定と遷移

    1.HTTPリクエストヘッダーって、任意の項目名で値を設定する事ができるのでしょうか?   その場合、どのような設定方法(タグ?)になるのでしょうか。 2.HTTPリクエストヘッダーにある情報を設定し、   そして、そこから別のページに遷移しその別のページで、遷移前に設定していた   HTTPリクエストヘッダーの情報を読み込みたいのですが、実現可能でしょうか?   また可能な場合、例えば、Javascript、HTMLなんかを利用して可能でしょうか? 初歩的な事かも知れませんが、よく分からず困ってます。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • HTTP リクエストヘッダの取得方法について

    表記の内容についてご存知の方がいらっしゃい ましたら、ご教授いただけませんでしょうか。 HTTPのリクエストヘッダに付与されている 環境変数「HTTP_IV_USER」 もしくは 「IV_USER」を 取得する方法について教えて頂けませんでしょうか。  [実行環境]  OS:Windows2000 Server  Webサーバ:Oracle Application Server 9.0.2 その他にOracleのCDに入っているP/L SQLの WebToolkitがインストールされてます。 当方としては取得したリクエストヘッダの 値をP/L SQLのプログラムを通してOracleの データベースに書込みたいと思っております。 何卒どうぞよろしくお願い致します。

  • PHPのHTTP/Requesをローカルでテストする方法は?

    PHP初心者なのですが、 初めてPHPのPEARパッケージにあるHTTP/Requestクラスを使って、別サーバーのAPIに対し、XMLのリクエストをし、XMLのレスポンスを受け取るやり取りをする関数を作りたいと思い、下記のような関数を作ってみたのですが、ローカル環境でどのようにテストすれば、HTTP/Requestの挙動をうまく確認できるかが思い浮かばずに、止まってしまいました。 どのようにテストすれば挙動がローカルで確認できるか、どなたか、ご教授お願いします!!! ----------- 制作した関数 引数1:リクエスト先URL、引数2: function testHttp($requestUrl,$requestXml){ $option = array( "timeout" => "3", // タイムアウトの秒数指定 "allowRedirects" => true // リダイレクトの許可 ); // HTTP_Requestの初期化 $http = new HTTP_Request($requestUrl, $option); // HTTPのヘッダー設定 $http->addHeader("User-Agent", "My PEAR PROGRAM"); $http->addHeader("Referer", $obj->protMember('LOGIN_URL')); $http->setMethod(HTTP_REQUEST_METHOD_POST); // HTTPリクエスト実行 $response = $http->sendRequest(); if (!PEAR::isError($response)) { $responseVal['resCode'] = $http->getResponseCode(); // ResponseCode $responseVal['resBody'] = $http->getResponseBody(); // ResponseBody return $responseVal; }else{ exit(); } }

    • 締切済み
    • PHP
  • HTTP通信とWEBアプリに関する質問です。

    一般的なWEB三層があるとします。 仮に、WEBサーバ(Nginx) APサーバ(tomcat)とします。 1:とあるクライアントから、http1.1リクエストをした際に、 WEBサーバでリクエストヘッダのconnectionヘッダのみ削除することは可能でしょうか。 2:上記1で、削除が可能な場合、APサーバの動き方はどのように変わりますでしょうか。 (connectionヘッダは、デフォルトで全てcloseで扱うようになる?)

専門家に質問してみよう