2012-08-31 14 views
8

Jak to możliwe, że get_headers() może zwrócić inny wynik niż uzyskanie przez CURL? Tu jest mój kodu:PHP get_headers() zgłasza różne nagłówki niż 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); 

Jest to wynikiem:

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

Co nagłówki nie curl wysłać? –

+0

@PhpMyCoder Zawarłem powyższy kod. Nie wiem, jak określić, jakie nagłówki wysyła. – Mike

Odpowiedz

6

get_headers zrobi żądanie GET domyślnie podczas konfigurowania cURL zrobić żądanie HEAD. Zacznij poprzez żądanie identyczne co cURL wysyła poprzez umieszczenie inny HTTP stream contextusing HEAD for the request method.

Ponadto serwer wydaje się oczekiwać agent użytkownika, więc upewnij się, że zarówno provide user_agent in php.ini lub dodać go do kontekstu strumienia.

Poniższy powinno działać:

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

Zobacz http://codepad.viper-7.com/cOO9XS

Zauważ, że stream_context_set_default modyfikuje globalny domyślny Stream kontekście więc wszelkie rozmowy do innych metod wykorzystujących ten strumień opakowanie będzie teraz zrobić żądania HEAD raz dzwoniłeś powyższe. Inaczej niż na przykład, file_get_contents, get_headers nie zezwala na dostarczanie kontekstu strumienia niestandardowego za pośrednictwem argumentów do funkcji. Innymi słowy, upewnij się, że zmieniłeś metodę z powrotem na GET po otrzymaniu nagłówków.

+0

Gdzie jest PO dzwoni do example.com? – sberry

4

Dodaj inny nagłówek User-Agent przed get_headers:

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" 
     ) 
    ) 
); 

I równie dobrze może określić HEAD od kiedy tylko chcesz nagłówki. Dzięki tej zmianie otrzymujesz właściwe nagłówki.

WYJŚCIE

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