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

    Comment est-il possible que get_headers() puisse renvoyer un résultat différent de celui obtenu par CURL? Voici mon code:PHP get_headers() signale différents en-têtes 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); 
    

    Ceci est le résultat:

    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

    Qu'est-ce que les en-têtes ne se recourbe envoyer? –

    +0

    @PhpMyCoder J'ai inclus le code ci-dessus. Je ne sais pas comment dire quels en-têtes il envoie. – Mike

    Répondre

    6

    get_headers fera une requête GET par défaut alors que vous avez configuré cURL pour faire une requête HEAD. Commencez en faisant la demande identique à ce que cURL envoie en mettant un autre HTTP stream contextusing HEAD for the request method.

    En outre, le serveur semble attendre un agent utilisateur, alors assurez-vous soit provide user_agent in php.ini ou l'ajouter au contexte du cours d'eau.

    Ce qui suit devrait fonctionner:

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

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

    Notez que stream_context_set_default modifie la valeur par défaut globale Contexte Stream, donc tous les appels vers d'autres méthodes utilisant cette enveloppe de flux va maintenant faire les requêtes HEAD une fois que vous appelé ce qui précède. Contrairement à file_get_contents par exemple, get_headers ne permet pas de fournir un contexte de flux personnalisé via des arguments à la fonction. En d'autres termes, assurez-vous de revenir à la méthode GET après avoir obtenu les en-têtes.

    +0

    Où est l'appel OP à example.com? – sberry

    4

    Ajouter un autre en-tête User-Agent avant 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" 
         ) 
        ) 
    ); 
    

    Et, pourrait aussi bien préciser HEAD puisque vous ne souhaitez que des en-têtes. Avec ce changement, vous obtenez les bons en-têtes.

    SORTIE

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