我正在尝试使用
PHP下载网页的内容.
@H_404_1@当我发出命令时:
$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.PHP?searchMode=2");
它返回一个报告服务器已关闭的页面.然而,当我将相同的URL粘贴到我的浏览器中时,我得到了预期的页面.
有谁知道是什么导致了这个? file_get_contents是否会传输任何区别于浏览器请求的标头?
是的,存在差异 – 浏览器倾向于发送大量的额外的
HTTP headers,我会说;并且两者发送的可能没有相同的值.
在这里,经过几次测试后,似乎需要传递名为Accept的HTTP头.
这可以使用file_get_contents的第三个参数来完成,以指定附加上下文信息:
$opts = array('http' => array( 'method' => 'GET',//'user_agent ' => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100301 Ubuntu/9.10 (karmic) Firefox/3.6",'header' => array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*\/*;q=0.8 ' ),) ); $context = stream_context_create($opts); $f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.PHP?searchMode=2",false,$context); echo $f;
备注:
>我首先测试了传递用户代理,但似乎没有必要 – 这就是为什么相应的行在这里作为注释@H_404_1@>该值用于Accept标头,是我在尝试使用file_get_contents之前使用Firefox请求该页面时使用的Firefox.
>其他一些值可能没问题,但我没有做任何测试来确定哪个值是必需的值.
有关更多信息,您可以查看:
> file_get_contents
@H_404_1@> stream_context_create
@H_404_1@> Context options and parameters@H_404_1@> HTTP context options – 这是有趣的页面,在这里;-)