我需要获取一个页面的内容,该页面总是发送一个Content-Length: 0
标头,但该页面从不为空。
file_get_contents(url)
只是返回一个空字符串。
页面返回的整个标题是:
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
)
我相信,没有一个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.1rn";
$sOut .= "Host: " . $aURL["host"] . "rn";
$sOut .= "Connection: Closernrn";
fputs($iHandle, $sOut);
while (!feof($iHandle))
{
$sResult .= fread($iHandle, 1024);
}
}
然后切下标题。
正如Optimist所指出的,问题与标头无关,而是我没有向服务器发送任何用户代理标头。
尽管服务器总是返回Content-Length: 0
,但file_get_contents
在发送用户代理标头后运行良好。
奇怪。