PHP file_get_contents()和设置请求标头


121

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

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

还是有另一个功能可以完成此任务?

Answers:


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);

您也许可以遵循这种模式来实现您想要的目标,但是我还没有亲自测试过。(如果它不起作用,请随时查看我的其他答案)



18
这是此页面上唯一有用的答案
Gordon

9
我希望这里有更多的人给出这个问题的实际答案,而不仅仅是指向cURL页面。谢谢。
Merijn 2012年

3
突然好奇:默认的用户代理是file_get_contents()什么?它指定一个吗?
猛禽2015年

5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');转到user-agent.me并从那里复制您的..或编辑php.ini以进行全局更改
jaggedsoft

88

这是对我有用的东西(Dominic仅短了一行)。

$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
您不应假冒浏览器的用户代理。而是为您的工具创建一个User-Agent字符串。 www-archive.mozilla.org/build/revised-user-agent-strings.html可以提供一些有关格式的想法。
Dereckson

1
@Vince我认为在某些情况下它可能同时起作用。在我的情况下,像这样将代理标头设置为字符串(WAF需要非空用户代理才能传递请求)有效
dhaupin

3
@Vince PHP文档声明可以同时使用两者,并且如果同时指定了“ User-Agent”,则header它将覆盖user_agent数组元素。
先生怀特

注意:切勿对包含特殊字符(如\ n或\ r)的字符串使用单引号。PHP将无法正确解释它们,并且在发送标头的情况下,您的标头将无法正确发送。
ak93

1
@最简单的@Fanky可能是“ YourTool / 1.0.0”。发布新版本时,也可以更改用户代理版本“ YourTool / 1.3.5”。
Dereckson

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
这根本无法回答问题。
戈登

32
也许不是,但是它回答了标题中暗示的相反问题,即如何从file_get_contents中读取响应头。这就是Google在调查该问题时着陆的地方。
Rich Remer 2014年


-1

使用php cURL库可能是正确的方法,因为该库具有比simple函数更多的功能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实现的用例。
戈登

-1

如果您不需要HTTPS并且curl在您的系统上不可用,则可以使用 fsockopen

此功能打开一个连接,您可以像使用普通文件句柄一样从中进行读取和写入。


2
是的,但这也意味着OP必须手动实现HTTP协议。另外,OP并没有询问替代方案,file_get_contents因此这有点离题。
戈登

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.