Вземете 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