1

常に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
)
4

2 に答える 2

0

Optimist が指摘したように、問題はヘッダーとは何の関係もありませんでしたが、User-Agent ヘッダーをサーバーに送信しなかったことが原因です。

file_get_contentsサーバーが常にContent-Length: 0.

変。

于 2012-05-30T19:03:10.820 に答える
0

私は、HTTP レベルの関数はどれもそのような答えを読み取ることができないと信じています。間違った HTTP 回答なので、「my body is empty, dont read it」と表示されます。

物理的にソケットを読み取る 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);
    }
}

あとはヘッダーをカットするだけです。

于 2012-02-20T16:44:52.313 に答える