8

get_headers()CURL で取得するのとは異なる結果を返す可能性があるのはどうしてですか? これが私のコードです:

header("Content-type: text/plain");
$url = 'http://www.foxbusiness.com/index.html';

echo "get_headers() headers:\n\n";
$headers = get_headers($url);
print_r($headers);

echo "\n\nCURL headers\n\n";
$curl = curl_init();
curl_setopt_array( $curl, array(
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => $url ) );
$headers = explode( "\n", curl_exec( $curl ) );
curl_close( $curl );
print_r($headers);

結果は次のとおりです。

get_headers() headers:

Array
(
    [0] => HTTP/1.0 403 Forbidden
    [1] => Server: AkamaiGHost
    [2] => Mime-Version: 1.0
    [3] => Content-Type: text/html
    [4] => Content-Length: 283
    [5] => Expires: Fri, 31 Aug 2012 07:29:14 GMT
    [6] => Date: Fri, 31 Aug 2012 07:29:14 GMT
    [7] => Connection: close
)


CURL headers

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Server: Apache
    [2] => X-FoxNews-EdgeTTL: 2m
    [3] => Content-Type: text/html;charset=UTF-8
    [4] => Cache-Control: max-age=64
    [5] => Date: Fri, 31 Aug 2012 07:29:14 GMT
    [6] => Connection: keep-alive
    [7] => 
    [8] => 
)
4

2 に答える 2

7

get_headersHEAD リクエストを実行するように cURL を構成している間、デフォルトで GET リクエストを実行します。まず、リクエスト メソッドに HEAD を使用して異なるHTTP ストリーム コンテキスト を設定し、cURL が送信するものと同一のリクエストを作成します。

また、サーバーはユーザー エージェントを期待しているようです。そのためuser_agent、php.ini で指定するか、ストリーム コンテキストに追加してください。

以下が機能するはずです。

stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD',
            'user_agent' => "PHP"
        )
    )
);

http://codepad.viper-7.com/cOO9XSを参照してください。

グローバルなデフォルトのストリーム コンテキストを変更することに注意してくださいstream_context_set_default。したがって、このストリーム ラッパーを使用する他のメソッドへの呼び出しは、上記を呼び出すと HEAD リクエストを実行するようになります。たとえば、 とは異なり、file_get_contents引数get_headersを介してカスタム ストリーム コンテキストを関数に提供することはできません。つまり、ヘッダーを取得したら、必ずメソッドを GET に戻してください。

于 2012-08-31T07:49:10.280 に答える
4

get_headers の前に別の User-Agent ヘッダーを追加します。

stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD',
            'header' => "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1\r\n"
        )
    )
);

また、ヘッダーのみが必要なため、HEAD を指定することもできます。この変更により、適切なヘッダーが得られます。

出力

get_headers() headers:

Array
(
    [0] => HTTP/1.0 200 OK
    [1] => Server: Apache
    [2] => X-FoxNews-EdgeTTL: 2m
    [3] => Content-Type: text/html;charset=UTF-8
    [4] => Cache-Control: max-age=76
    [5] => Date: Fri, 31 Aug 2012 07:53:24 GMT
    [6] => Connection: close
)


CURL headers

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Server: Apache
    [2] => X-FoxNews-EdgeTTL: 2m
    [3] => Content-Type: text/html;charset=UTF-8
    [4] => Cache-Control: max-age=76
    [5] => Date: Fri, 31 Aug 2012 07:53:24 GMT
    [6] => Connection: keep-alive
    [7] => 
    [8] => 
)
于 2012-08-31T07:54:36.143 に答える