2012-08-31 10 views
8

get_headers()がCURLで取得する場合とは異なる結果を返す可能性がありますか?ここに私のコードは次のとおりです。PHP 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); 

これが結果です:あなたはHEADリクエストを行うためにカールを構成しながら

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] => 
) 
+0

何ヘッダーを送信カールのでしょうか? –

+0

@PhpMyCoder私は上記のコードを含めました。私はそれがどのヘッダーを送信するかをどのように伝えるか分かりません。 – Mike

答えて

6

get_headersは、デフォルトでGETリクエストを行います。カールはまた、異なるHTTP stream contextusing HEAD for the request method.

を入れて送信するものへの要求が同じことから始め、サーバがユーザエージェントを期待するので、必ずどちらかprovide user_agent in php.iniを作るか、またはストリームコンテキストに追加しているようです。

次は動作するはずです:

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

stream_context_set_defaultは、グローバルなデフォルトのストリームコンテキストを変更するので、あなたが呼ばれたら、このストリームラッパーを使用して、他の方法への呼び出しが今HEADリクエストを行いますことをhttp://codepad.viper-7.com/cOO9XS

ノートを参照してください。上記。たとえば、file_get_contentsとは異なり、get_headersでは、関数への引数を使用してカスタムストリームコンテキストを指定することはできません。つまり、ヘッダーを取得した後で、メソッドをGETに戻してください。

+0

OPの呼び出しはどこですか? – sberry

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を指定することができます。この変更により、正しいヘッダーが得られます。

OUTPUT

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] => 
) 
関連する問題