46

是否可以使用 PHP 获取当前请求的 http 标头?我没有使用 Apache 作为网络服务器,而是使用 nginx。

我尝试使用getallheaders(),但我得到了Call to undefined function getallheaders().

4

6 回答 6

50

取自文档,有人写了评论...

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; 
    } 
} 
于 2013-07-11T10:05:10.987 回答
26

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

(希望我可以将其添加为对他的回答的评论,但仍然建立在那个声誉的基础上——我的第一个回复之一)

于 2015-01-09T10:29:19.003 回答
3

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;
}
于 2015-03-27T18:56:00.273 回答
3

您可以将您的服务器升级到 PHP 5.4,从而使您可以通过 fastcgi 访问getallheaders()foreach ,或者只需使用循环和一些正则表达式从 $_SERVER 解析您需要的内容。

于 2012-11-05T00:53:39.763 回答
3

这个问题最终在 PHP 7.3.0 中得到解决,请查看发行说明

修复了错误#62596(PHP-FPM 缺少 getallheaders())。

于 2019-01-07T14:44:18.227 回答
0

这应该有效:

<?php 

print_r(
  array_intersect_key(
    $_SERVER,
    array_flip(
      preg_grep(
        '/^HTTP_/', 
        array_keys($_SERVER),
        0
      )
    )
  )
);
于 2018-08-31T18:34:19.350 回答