我如何阅读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']
从$_SERVER
variables创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 />"; } ?>