【问题标题】:Ignore Content-Length header when using file_get_contents使用 file_get_contents 时忽略 Content-Length 标头
【发布时间】:2012-02-18 18:08:42
【问题描述】:

我需要获取一个页面的内容,该页面总是发送一个Content-Length: 0 标头,但是该页面永远不会为空。

file_get_contents(url) 只返回一个空字符串。

页面返回的整个header是:

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.10
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Sat, 18 Feb 2012 18:14:59 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Sat, 18 Feb 2012 18:14:59 GMT
Server: lighttpd

是否可以使用 file_get_contents 并忽略标题,还是我需要使用 curl?

编辑

get_headers(url) 输出(使用print_r):

Array
(
    [0] => HTTP/1.0 200 OK
    [1] => X-Powered-By: PHP/5.3.10
    [2] => Content-type: text/html
    [3] => Content-Length: 0
    [4] => Connection: close
    [5] => Date: Sat, 18 Feb 2012 22:39:52 GMT
    [6] => Server: lighttpd
)

【问题讨论】:

  • 你确定没有重定向或类似的事情发生吗?是否将错误通知站点的系统管理员?你试过file_get_contents() - 它真的听content-length 标头吗?
  • 很奇怪。我想你可以试试fread(),因为你可以在那里指定一个长度。不知道它是否会起作用 - 我会与网站管理员交谈,如果响应包含数据,这显然是一个错误
  • 所有检索 URL 正文内容的 PHP 函数都会忽略标题并带来内容。检查 allow_url_fopen 指令、error_reporting 以及目标是否会以某种方式阻止您。你可以在你的问题上粘贴 get_headers() 吗?
  • 您确定请求应该返回文本吗?我问这个是因为那里有一些网站会根据您在请求中添加的标题类型(“接受”、“用户代理”等)返回不同的结果。这些标头由您的浏览器添加,但在使用 PHP 时必须由您手动添加
  • @Optimist 是缺少 User-Agent 标头导致服务器返回空字符串。奇怪的是,无论如何,Content-Length: 0 响应标头始终存在。如果您将评论添加为答案,我将接受它作为正确答案。

标签: php http-headers file-get-contents http-content-length


【解决方案1】:

我相信,没有一个 HTTP 级别的函数无法读取这样的答案。因为它是不正确的 HTTP 答案,所以它说“我的身体是空的,不要阅读它”

你肯定需要你自己的基于 fread 的函数,它会物理读取套接字。像这样的:

$aURL    = parse_url($sURL);

if ($iHandle = fsockopen($aURL["host"], 80, $iError, $sError))
{
    $sQuery = substr($sURL, strpos($sURL, $aURL["host"]) + strlen($aURL["host"]));

    $sOut   = "GET " . (($sQuery != "") ? $sQuery : "/") . " HTTP/1.1\r\n";
    $sOut  .= "Host: " . $aURL["host"] . "\r\n";
    $sOut  .= "Connection: Close\r\n\r\n";

    fputs($iHandle, $sOut);

    while (!feof($iHandle))
    {
        $sResult .= fread($iHandle, 1024);
    }
}

然后剪掉标题。

【讨论】:

  • 请看cmets,我已经解决了。
  • 你错了。我在 cmets 中发布:所有检索 URL 正文内容的 PHP 函数都会忽略标题并带来内容。所以 Content-lenght: 0 不会影响任何事情。
【解决方案2】:

正如 Optimist 所指出的,问题与标头无关,而是我没有向服务器发送任何 User-Agent 标头。

file_get_contents 在发送 User-Agent 标头后完美运行,即使服务器总是返回 Content-Length: 0

很奇怪。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多