我如何阅读PHP中的任何请求标头

我应该如何阅读PHP中的任何标题?

例如自定义标题: X-Requested-With

如果你只需要一个头,而不是所有的头,最快的方法是:

 <?php // Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_') $headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX']; 

否则,如果您将PHP作为Apache模块运行,或者从PHP 5.4开始,使用FastCGI(简单方法)运行:

apache_request_headers()

 <?php $headers = apache_request_headers(); foreach ($headers as $header => $value) { echo "$header: $value <br />\n"; } 

否则:在其他情况下,您可以使用(userland implementation):

 <?php function getRequestHeaders() { $headers = array(); foreach($_SERVER as $key => $value) { if (substr($key, 0, 5) <> 'HTTP_') { continue; } $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5))))); $headers[$header] = $value; } return $headers; } $headers = getRequestHeaders(); foreach ($headers as $header => $value) { echo "$header: $value <br />\n"; } 

另见
getallheaders() – (PHP> = 5.4) 跨平台版 apache_request_headers()别名apache_response_headers() – 获取所有HTTP响应头。
headers_list() – 获取要发送的标题列表。

 $_SERVER['HTTP_X_REQUESTED_WITH'] 

RFC3875,4.1.18 :

如果使用的协议是HTTP,名称以HTTP_开头的元variables包含从客户机请求头字段中读取的值。 HTTP标题字段名称被转换为大写,所有出现的-被replace为_并且具有HTTP_前缀以给出元variables名称。

您应该在$_SERVER全局variables中find所有HTTP标头,前缀为HTTP_ uppercased,破折号( – )replace为下划线(_)。

例如你的X-Requested-With可以在下面find:

 $_SERVER['HTTP_X_REQUESTED_WITH'] 

$_SERVERvariables创build一个关联数组可能会很方便。 这可以用几种样式完成,但是这里有一个输出camel键的函数:

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

现在只需使用$headers['XRequestedWith']来检索所需的标题。

$_SERVER上的PHP手册: http : //php.net/manual/en/reserved.variables.server.php

自PHP 5.4.0以来,您可以使用getallheaders函数将所有请求的标题作为关联数组返回:

 var_dump(getallheaders()); // array(8) { //  ["Accept"]=> //  string(63) "text/html[...]" //  ["Accept-Charset"]=> //  string(31) "ISSO-8859-1[...]" //  ["Accept-Encoding"]=> //  string(17) "gzip,deflate,sdch" //  ["Accept-Language"]=> //  string(14) "en-US,en;q=0.8" //  ["Cache-Control"]=> //  string(9) "max-age=0" //  ["Connection"]=> //  string(10) "keep-alive" //  ["Host"]=> //  string(9) "localhost" //  ["User-Agent"]=> //  string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) [...]" // } 

早些时候,这个函数只在PHP作为Apache / NSAPI模块运行时才起作用。

strtolower缺乏几个build议的解决scheme,RFC2616(HTTP / 1.1)定义标题字段作为不区分大小写的实体。 整个事情,不只是价值的一部分。

所以build议像只parsingHTTP_条目是错误的。

最好是这样的:

 if (!function_exists('getallheaders')) { foreach ($_SERVER as $name => $value) { /* RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. */ if (strtolower(substr($name, 0, 5)) == 'http_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } $this->request_headers=$headers; } else { $this->request_headers = getallheaders(); } 

注意与以前的build议的细微差异。 这里的函数也适用于php-fpm(+ nginx)。

通过标题键,这个函数将返回它的值,你可以使用for循环获取标题值

 function get_header( $headerKey ) { $test = getallheaders(); if ( array_key_exists($headerKey, $test) ) { $headerValue = $test[ $headerKey ]; } return $headerValue; } 

为了简单起见,下面是你如何得到你想要的:

简单:

 $headerValue = $_SERVER['HTTP_X_REQUESTED_WITH']; 

或者当你需要一次获得一个:

 <?php /** * @param $pHeaderKey * @return mixed */ function get_header( $pHeaderKey ) { // Expanded for clarity. $headerKey = str_replace('-', '_', $pHeaderKey); $headerKey = strtoupper($headerKey); $headerValue = NULL; // Uncomment the if when you do not want to throw an undefined index error. // I leave it out because I like my app to tell me when it can't find something I expect. //if ( array_key_exists($headerKey, $_SERVER) ) { $headerValue = $_SERVER[ $headerKey ]; //} return $headerValue; } // X-Requested-With mainly used to identify Ajax requests. Most JavaScript frameworks // send this header with value of XMLHttpRequest, so this will not always be present. $header_x_requested_with = get_header( 'X-Requested-With' ); 

其他头文件也在超级全局数组$ _SERVER中,你可以阅读如何在这里得到他们: http : //php.net/manual/en/reserved.variables.server.php

这是我如何做的。 如果$ header_name没有被传递,你需要获得所有的头文件:

 <?php function getHeaders($header_name=null) { $keys=array_keys($_SERVER); if(is_null($header_name)) { $headers=preg_grep("/^HTTP_(.*)/si", $keys); } else { $header_name_safe=str_replace("-", "_", strtoupper(preg_quote($header_name))); $headers=preg_grep("/^HTTP_${header_name_safe}$/si", $keys); } foreach($headers as $header) { if(is_null($header_name)){ $headervals[substr($header, 5)]=$_SERVER[$header]; } else { return $_SERVER[$header]; } } return $headervals; } print_r(getHeaders()); echo "\n\n".getHeaders("Accept-Language"); ?> 

对于我来说,看起来比其他答案中的大多数例子要简单得多。 这也得到了方法(GET / POST /等),并获得所有的标题,如果你想在日志中使用它可以是有用的所需的URI。

这是输出:

 Array ( [HOST] => 127.0.0.1 [USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0 [ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [ACCEPT_LANGUAGE] => en-US,en;q=0.5 [ACCEPT_ENCODING] => gzip, deflate [COOKIE] => PHPSESSID=MySessionCookieHere [CONNECTION] => keep-alive ) en-US,en;q=0.5 

这是一个简单的方法来做到这一点。

 // echo get_header('X-Requested-With'); function get_header($field) { $headers = headers_list(); foreach ($headers as $header) { list($key, $value) = preg_split('/:\s*/', $header); if ($key == $field) return $value; } } 
 function getCustomHeaders() { $headers = array(); foreach($_SERVER as $key => $value) { if(preg_match("/^HTTP_X_/", $key)) $headers[$key] = $value; } return $headers; } 

我使用这个函数来获取自定义头文件,如果头文件从“HTTP_X_”开始,我们在数组中推入:)

我正在使用CodeIgniter并使用下面的代码来获取它。 将来可能对某人有用。

 $this->input->get_request_header('X-Requested-With'); 

这个小的PHP片段可以帮助你:

 <?php foreach($_SERVER as $key => $value){ echo '$_SERVER["'.$key.'"] = '.$value."<br />"; } ?>