【问题标题】:PHP file_get_contents() behaves differently to browserPHP file_get_contents() 的行为与浏览器不同
【发布时间】:2011-02-02 15:45:08
【问题描述】:

我正在尝试使用 PHP 下载网页的内容。 当我发出命令时:

$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.php?searchMode=2");

它返回一个页面,报告服务器已关闭。然而,当我将相同的 URL 粘贴到浏览器中时,我得到了预期的页面。

有人知道是什么原因造成的吗? file_get_contents 是否传输任何将其与浏览器请求区分开来的标头?

【问题讨论】:

    标签: php file-get-contents


    【解决方案1】:

    是的,有区别——浏览器倾向于发送大量附加的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;
    

    有了这个,我就可以得到页面的HTML代码了。


    备注:

    • 我第一次测试通过User-Agent,但似乎没有必要--这就是为什么相应的行在这里作为注释
    • 用于Accept 标头的值是我在尝试使用file_get_contents 之前使用Firefox 请求该页面时使用的一个Firefox。
      • 其他一些值可能没问题,但我没有做任何测试来确定哪个值是必需的。


    欲了解更多信息,您可以查看:

    【讨论】:

      【解决方案2】:

      用 %20 替换所有空格

      【讨论】:

        猜你喜欢
        • 2014-06-20
        • 2014-08-20
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        相关资源
        最近更新 更多