PHP get_headers () informa diferentes encabezados que CURL

¿Cómo es posible que get_headers() pueda devolver un resultado diferente al de CURL? Aquí está mi código:

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

Este es el resultado:

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

get_headers hará una solicitud GET por defecto mientras configuraste cURL para hacer una solicitud HEAD. Comience por hacer que la solicitud sea idéntica a lo que envía cURL al poner un contexto de flujo HTTP diferente usando HEAD para el método de solicitud.

Además, el servidor parece esperar un User Agent, así que asegúrese de proporcionar user_agent en php.ini o agregarlo al contexto de la transmisión.

Lo siguiente debería funcionar:

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

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

Tenga en cuenta que stream_context_set_default modifica el Contexto de flujo global predeterminado, por lo que cualquier llamada a otros métodos que usen este contenedor de flujo ahora hará solicitudes HEAD una vez que haya llamado al anterior. A diferencia, por ejemplo, file_get_contents , get_headers no permite el suministro de un contexto de flujo personalizado mediante argumentos a la función. En otras palabras, asegúrese de cambiar el método de nuevo a GET después de obtener los encabezados.

Agregue un encabezado de usuario-agente diferente antes de 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" ) ) ); 

Y, también podría especificar HEAD ya que solo quiere encabezados. Con este cambio, obtienes los encabezados correctos.

SALIDA

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