PHP file_get_contents()およびリクエストヘッダーの設定


121

PHPでは、HTTPヘッダーを送信できますfile_get_contents()か?

php.iniファイルからユーザーエージェントを送信できることは承知しています。しかし、あなたはまた、のような他の情報を送信することができHTTP_ACCEPTHTTP_ACCEPT_LANGUAGEと、HTTP_CONNECTIONfile_get_contents()

それともこれを達成する別の機能はありますか?

回答:


318

実際には、file_get_contents()関数についてさらに読むと:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

あなたはあなたが求めているものを達成するためにこのパターンに従うことができるかもしれませんが、私はこれを個人的にテストしていません。(それがうまくいかない場合は、他の私の答えをチェックしてください)


1
次も参照してください:docs.php.net/context およびdocs.php.net/stream_context_create
VolkerK

18
これはこのページで唯一の有用な回答です
Gordon

9
ここでもっと多くの人がcURLページを指すのではなく、この質問に実際に答えてくれることを願っています。ありがとう。
Merijn

3
突然興味があります:のデフォルトのユーザーエージェントはfile_get_contents()何ですか?それを指定しますか?
ラプター

5
@Raptorはuser-agent.meにini_set('user_agent', 'SomeBrowser v42.0.4711');移動してそこからコピーするか、php.iniを編集してグローバルに変更します
jaggedsoft

88

ここに私のために働いたものがあります(ドミニクは1行だけ短いものでした)。

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);

6
ブラウザのユーザーエージェントを偽装しないでください。代わりに、ツールのユーザーエージェント文字列を作成します。 www-archive.mozilla.org/build/revised-user-agent-strings.htmlは、フォーマットについてのアイデアを与える可能性があります。
デレクソン2013年

1
@Vinceは、特定の状況で両方の方法で機能する可能性があると思います。そのようなエージェントヘッダーを文字列として設定すると、私の場合は機能しました(WAFは、要求を渡すために空でないユーザーエージェントが必要でした)
dhaupin

3
@Vince PHPのドキュメントには、両方を使用できることが記載されており、両方が指定されている場合、「User-Agent」headeruser_agent配列要素をオーバーライドします。
MrWhite 2017

注:\ nや\ rなどの特殊文字を含む文字列には、一重引用符を使用しないでください。PHPはそれらを正しく解釈せず、ヘッダーを送信する場合、ヘッダーは正しく送信されません。
ak93 2018年

1
@Fanky最も簡単なのは "YourTool / 1.0.0"です。新しいバージョンをリリースするときに、ユーザーエージェントのバージョン「YourTool / 1.3.5」をバンプすることもできます。
デレクソン

39

この変数を使用して、file_get_contents()関数の後に応答ヘッダーを取得できます。

コード:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

出力:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}

6
これは質問にまったく答えません。
Gordon、

32
多分そうではないかもしれませんが、タイトルに含まれている反対の質問、つまりfile_get_contentsから応答ヘッダーを読み取る方法に答えます。そして、これがその質問を調査するときにGoogleが上陸する場所です。
リッチ・レーマー2014


-1

php cURLライブラリを使用するのがおそらく正しい方法ですfile_get_contents(...)。このライブラリには、単純なライブラリよりも多くの機能があるからです。

例:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>

5
あなたが示すスニペットfile_get_contentsも同様に簡単に達成でき、cURLでのみ達成できるユースケースにまだ出会っていません。
Gordon

-1

HTTPSが不要で、curlがシステムで利用できない場合は、 fsockopen

この関数は、通常のファイルハンドルの場合と同様に、読み取りと書き込みの両方が可能な接続を開きます。


2
はい。ただし、OPが手動でHTTPプロトコルを実装する必要があることも意味します。また、OPは代替案について質問しなかったfile_get_contentsため、これはトピックから外れた回答になります。
Gordon

-3

残念ながら、それはfile_get_contents()本当にその程度の制御を提供するようには見えません。通常、cURL拡張が最初に登場しますが、非常に単純で単純なHTTPリクエストには、PECL_HTTP拡張(http://pecl.php.net/package/pecl_http)を強くお勧めします。(cURLよりも操作がはるかに簡単です)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.