簡體   English   中英

從PHP中獲取當前請求的http標頭

[英]Get the http headers from current request in PHP

是否可以使用PHP獲取當前請求的http標頭? 不是使用Apache作為Web服務器,而是使用nginx。

我嘗試使用getallheaders()但我正在Call to undefined function getallheaders()

從文檔中取出有人撰寫評論 ......

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

改進了@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;
    }
}

(希望我能把這個作為評論添加到他的答案中,但仍然建立在那個聲譽上 - 我的第一個回復之一)

您可以將服務器升級到PHP 5.4,從而可以通過fastcgi訪問getallheaders() ,或者只需使用foreach循環和一個小正則表達式解析$ _SERVER所需的內容。

為nginx組合getallheaders()+ apache_request_headers()

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

這個問題最終在PHP 7.3.0中得到解決,請查看發行說明

修復了錯誤#62596 (PHP-FPM缺少getallheaders())。

這應該工作:

<?php 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM