web-dev-qa-db-fra.com

Récupère les en-têtes http de la requête en cours dans PHP

Est-il possible d'obtenir les en-têtes http de la requête en cours avec PHP? Je n'utilise pas en utilisant Apache comme serveur Web, mais en utilisant nginx.

J'ai essayé d'utiliser getallheaders() mais j'obtiens Call to undefined function getallheaders().

39
Justin

Tiré de la documentation, quelqu'un a écrit un commentaire ... 

if (!function_exists('getallheaders')) 
{ 
    function getallheaders() 
    { 
       $headers = array (); 
       foreach ($_SERVER as $name => $value) 
       { 
           if (substr($name, 0, 5) == 'HTTP_') 
           { 
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; 
           } 
       } 
       return $headers; 
    } 
} 
47
Layke

@Layke a amélioré sa fonction, ce qui le rend un peu plus sûr: 

if (!function_exists('getallheaders'))  {
    function getallheaders()
    {
        if (!is_array($_SERVER)) {
            return array();
        }

        $headers = array();
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) == 'HTTP_') {
                $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
            }
        }
        return $headers;
    }
}

(J'aurais bien voulu ajouter ceci comme commentaire à sa réponse, tout en continuant à me baser sur cette réputation, l'une de mes premières réponses)

23
JanDesch

Combiné getallheaders () + Apache_request_headers () pour nginx

    function get_nginx_headers($function_name='getallheaders'){

        $all_headers=array();

        if(function_exists($function_name)){ 

            $all_headers=$function_name();
        }
        else{

            foreach($_SERVER as $name => $value){

                if(substr($name,0,5)=='HTTP_'){

                    $name=substr($name,5);
                    $name=str_replace('_',' ',$name);
                    $name=strtolower($name);
                    $name=ucwords($name);
                    $name=str_replace(' ', '-', $name);

                    $all_headers[$name] = $value; 
                }
                elseif($function_name=='Apache_request_headers'){

                    $all_headers[$name] = $value; 
                }
            }
        }


        return $all_headers;
}
3
RafaSashi

Vous pouvez mettre à niveau votre serveur vers PHP 5.4, vous donnant ainsi accès à getallheaders () via fastcgi ou tout simplement analyser ce dont vous avez besoin dans $ _SERVER avec une boucle foreach et une petite regex.

3
Chris Wiegman

Ce problème a finalement été résolu dans PHP 7.3.0, vérifiez notes de publication .

Correction d'un bug # 62596 (getallheaders () manquant avec PHP-FPM).

1
Geo Salameh

Cela devrait fonctionner:

<?php 

print_r(
  array_intersect_key(
    $_SERVER,
    array_flip(
      preg_grep(
        '/^HTTP_/', 
        array_keys($_SERVER),
        0
      )
    )
  )
);
0
Volomike