web-dev-qa-db-ja.com

HTTP応答はカールし、異なる結果を取得します

HTTP応答ヘッダーで一連のURLを確認するには、curlで次の要求ヘッダーを送信します

foreach ( $urls as $url )
{
    // Setup headers - I used the same headers from Firefox version 2.0.0.6
    $header[ ] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[ ] = "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[ ] = "Cache-Control: max-age=0";
    $header[ ] = "Connection: keep-alive";
    $header[ ] = "Keep-Alive: 300";
    $header[ ] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[ ] = "Accept-Language: en-us,en;q=0.5";
    $header[ ] = "Pragma: "; // browsers keep this blank.

    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt( $ch, CURLOPT_REFERER, 'http://www.google.com');
    curl_setopt( $ch, CURLOPT_HEADER, true );
    curl_setopt( $ch, CURLOPT_NOBODY, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY );
    curl_setopt( $ch, CURLOPT_TIMEOUT, 10 ); //timeout 10 seconds
}

時々私は200OKを受け取りますが、それ以外の場合は私も良いと思う301、302、307を受け取りますが、無効なURLを識別するはずの406、500、504として奇妙なステータスを受け取ることもありますが、ブラウザで開くとは大丈夫です

たとえば、スクリプトは

http://www.awe.co.uk/ => HTTP/1.1 406 Not Acceptable

そしてwgetは

wget http://www.awe.co.uk/
--2011-06-23 15:26:26--  http://www.awe.co.uk/
Resolving www.awe.co.uk... 77.73.123.140
Connecting to www.awe.co.uk|77.73.123.140|:80... connected.
HTTP request sent, awaiting response... 200 OK

どのリクエストヘッダーが欠落しているか、過剰に追加されているかを誰かが知っていますか?

4
Fab

Host:配列にheader[]ヘッダーを指定していません。コンテンツサーバーへのHTTP1.1リクエストでは、Host:ヘッダーが必須です。 4xx以外の応答は、このプロトコルエラーに関しては寛容な誰かのコンテンツHTTPサーバーに偶然ヒットした場所です。

1
JdeBP

私の謙虚な意見では、あなたのスクリプトは大丈夫に見えます、そしてあなたは時々正しい結果を得ているのでそれはうまくいくはずです。

あなたはhttp://www.awe.co.uk/の所有者ですか?
一部の環境に応じて何をするかを決定するスクリプトが実行されている可能性があります。たとえば、スクリプトでは、ユーザーエージェント「googlebot」としてこのサイトにアクセスしていますが、wgetユーザーエージェントは「wget」になります。ウェブサーバー上のスクリプトは、それがGoogleであるかどうかをチェックし、ブラウザに表示されるものとはまったく異なるコンテンツを配信する場合があります。同様に、Webサーバーは異なる戻りコードを送信する場合があります。
この問題をテストするには、スクリプトを減らすか、wgetコマンドを拡張して同じリクエストを送信し、結果を比較することをお勧めします。

私が想像できるもう1つのことは、スクリプトをどのくらいの頻度で実行したかということです。たぶん、Webサーバーはスクリプトからの大量のトラフィックに気づき、誇張している場合は406(またはその他のもの)を送信します;-)

0
binfalse