Получить заголовки http из текущего запроса в PHP

Можно ли получить заголовки http текущего запроса с помощью PHP? Я не использую Apache в качестве веб-сервера, а использую nginx.

Я пытался использовать getallheaders(), но получаю Call to undefined function getallheaders().


person Justin    schedule 05.11.2012    source источник
comment
как вы можете видеть в моем ответе, вы все еще можете использовать getallheaders()   -  person gabrielem    schedule 05.11.2012
comment
Проголосуйте здесь: bugs.php.net/bug.php?id=62596   -  person Bell    schedule 12.03.2017


Ответы (6)


Взято из документации, кто-то написал комментарий...

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; 
    } 
} 
person Layke    schedule 11.07.2013
comment
Спасибо, это работает. Но не могли бы вы объяснить, какова цель ucwords и strtolower в этой функции? Это необходимо ? - person Michal S.; 20.11.2016
comment
Ошибка в этой функции заключается в том, что заголовки в верхнем регистре, такие как DNT (Do Not Track), станут Dnt, что НЕ относится к родным getallheaders(). - person Bell; 12.03.2017
comment
Авторизация не появилась с этой функцией... Есть идеи? - person Toto NaBendo; 26.04.2019

Улучшена @Layke его функция, что сделало ее использование более безопасным:

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

(хотел бы я просто добавить это как комментарий к его ответу, но все еще опираюсь на эту репутацию - один из моих первых ответов)

person JanDesch    schedule 09.01.2015

Вы можете обновить свой сервер до PHP 5.4, что даст вам доступ к getallheaders() через fastcgi или просто разобрать то, что вам нужно. $_SERVER с циклом foreach и небольшим регулярным выражением.

person Chris Wiegman    schedule 05.11.2012
comment
Всегда ли nginx работает на FastCGI? Поэтому getallheaders() не работает в PHP 5.3? - person Ben Harold; 31.05.2013
comment
@BenHarold См. журнал изменений getallheaders: 5.4: Эта функция стал доступен под FastCGI. Ранее он поддерживался только в том случае, если PHP был установлен как модуль Apache. - person Fred Wuerges; 31.05.2013
comment
@FredWuerges Я прочитал журнал изменений. Вот почему я задал вопросы. Сформулируем это немного лучше: всегда ли nginx использует FastCGI, и поэтому getallheaders() не работает при использовании PHP 5.3 или старше с nginx? Означает ли это, что и getallheaders(), и apache_request_headers() работают при использовании PHP 5.4 и nginx? - person Ben Harold; 01.06.2013
comment
@BenHarold Теперь ясно. Если следовать посылке чейнджлога, то делаем вывод, что руль всегда nginx с FastCGI, если PHP 5.4 или выше, будет работать. Таким образом, если PHP в версии 5.3 не будет работать на nginx. - person Fred Wuerges; 01.06.2013
comment
Это должно быть помечено как правильное. В версии 5.4 просто выполните $headers = getallheaders(); if ($token = $headers['Authorization']) {/*проверить токен*/} else {/*Не авторизован*/}. Очень простой. - person Stephen Smith; 06.07.2014
comment
Это все еще не работает на nginx, getallheaders хранится в функциях apache в документе PHP, поскольку это Apache, только что подтверждено на php 5.5 и nginx. - person Sammaye; 12.09.2014
comment
В настоящее время на PHP7 getallheaders не работает на nginx под FastCGI. - person Jesse Greathouse; 25.10.2015

Комбинация getallheaders() + apache_request_headers() для 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;
}
person RafaSashi    schedule 27.03.2015

Эта проблема была окончательно решена в PHP 7.3.0, см. примечания к выпуску.

Исправлена ​​ошибка #62596 (getallheaders() отсутствует в PHP-FPM).

person Geo Salameh    schedule 07.01.2019

Это должно работать:

<?php 

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