php
  • curl
  • http-headers
  • 2012-08-31 11 views 8 likes 
    8

    ¿Cómo es posible que get_headers() pueda devolver un resultado diferente que obtenerlos mediante CURL? Aquí está mi código:PHP get_headers() informa diferentes encabezados que 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); 
    

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

    Lo cabeceras no enrollamiento enviar? –

    +0

    @PhpMyCoder Incluí el código anterior. No estoy seguro de cómo decir qué encabezados envía. – Mike

    Respuesta

    6

    get_headers hará una petición GET por defecto, mientras que configuró cURL para hacer una petición HEAD. Comience por hacer la solicitud idéntica a la que envía el enrollamiento poniendo una diferente HTTP stream contextusing HEAD for the request method.

    Además, el servidor parece esperar que un agente de usuario, por lo que asegúrese de que sea provide user_agent in php.ini o añadirlo al contexto de secuencia.

    El siguiente debe 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 global corriente por defecto, por lo que todas las llamadas a otros métodos que utilizan esta envoltura de flujo ahora va a hacer peticiones HEAD una vez que se llama lo 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.

    +0

    ¿Dónde está el OP llamando a example.com? – sberry

    4

    añadir una cabecera User-Agent diferente antes 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, como bien podría especificar CABEZA ya que sólo desea cabeceras. 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] => 
    ) 
    
    Cuestiones relacionadas