PHP file_get_contents()和设置请求标头

Mar*_*cus 116 php http-headers

使用PHP,是否可以发送HTTP标头file_get_contents()

我知道您可以从您的php.ini文件中发送用户代理.但是,你能不能也发送其他信息,如HTTP_ACCEPT,HTTP_ACCEPT_LANGUAGEHTTP_CONNECTIONfile_get_contents()

或者是否有其他功能可以实现这一目标?

Dom*_*nes 296

实际上,在进一步阅读该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);
Run Code Online (Sandbox Code Playgroud)

您可以按照这种模式来实现您的目标,但我没有亲自测试过.(如果它不起作用,请随时查看我的其他答案)

  • 这是本页唯一有用的答案 (17认同)
  • 我希望这里的更多人能够给出这个问题的实际答案,而不是仅仅指向cURL页面.谢谢. (9认同)
  • @Raptor`ini_set('user_agent','SomeBrowser v42.0.4711');`转到http://user-agent.me并从那里复制你的..或编辑php.ini以全局更改它 (5认同)
  • 突然好奇:什么是`file_get_contents()`的**默认**用户代理?它指定一个? (3认同)

小智 86

这对我有用(多米尼克只有一条线).

$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);
Run Code Online (Sandbox Code Playgroud)

  • 您不应该模拟浏览器的用户代理.而是为您的工具创建一个User-Agent字符串.http://www-archive.mozilla.org/build/revised-user-agent-strings.html可以对格式有所了解. (6认同)
  • @Vince [PHP docs state](http://php.net/manual/en/context.http.php)两者都可以使用,"User-Agent"`header`将覆盖`user_agent`数组元素,如果两者都被指定. (3认同)
  • @Vince 我认为在某些情况下它可以双向工作。将这样的代理标头设置为字符串,在我的情况下有效(WAF 需要非空用户代理才能通过请求) (2认同)

小智 38

您可以使用此变量在file_get_contents()函数后检索响应标头.

码:

  file_get_contents("http://example.com");
  var_dump($http_response_header);
Run Code Online (Sandbox Code Playgroud)

输出:

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"
}
Run Code Online (Sandbox Code Playgroud)

  • 也许不是,但它回答了标题中隐含的相反问题,即如何从file_get_contents中读取响应头.这就是谷歌在调查这个问题时落地的地方. (32认同)
  • 这根本不回答这个问题. (4认同)