例如自定义标题:
X-Requested-With
。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'];
ELSE IF:您是作为Apache模块或者自PHP 5.4开始使用FastCGI(简单方法)运行PHP的:
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: 在其他情况下,可以使用(用户自定义实现):<?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";
}
参见:apache_request_headers()
的别名。
apache_response_headers() - 获取所有HTTP响应头信息。
headers_list() - 获取即将被发送的HTTP头列表。$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875,4.1.18:
如果使用的协议是HTTP,则以
HTTP_
开头的元变量名包含从客户端请求标头字段读取到的值。HTTP标头字段名称被转换为大写,所有出现的-
都替换为_
,并在前面加上HTTP_
来生成元变量名。
$_SERVER
变量中?PHP文档(http://php.net/manual/en/reserved.variables.server.php)对于我们可以确信其中有什么内容含糊其辞。 - Mark Amery_SERVER["HTTP_CACHE_CONTROL"] max-age=0
。 - Quassnoi$_SERVER
没有显示它们。然而,在阅读了您的答案后,我检查了我的 phpinfo.php 文件,发现这些头信息确实存在!所以,我回到我的调试脚本:print_r($_SERVER);die();
并进行了硬刷新(ctrl+f5),确实,缓存头现在正在显示。 - Evan de la Cruz你应该在全局变量 $_SERVER
中查找所有以 HTTP_
为前缀的 HTTP 标头,并将破折号 (-) 替换为下划线 (_)。
例如,你的 X-Requested-With
可以在以下位置找到:
$_SERVER['HTTP_X_REQUESTED_WITH']
从 $_SERVER
变量创建关联数组可能很方便。有几种风格可以实现,但这里是一个输出驼峰键的函数:
$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
parseRequestHeaders()
函数中也很难得出简单的解决方案。如果确实需要这样一个关联数组,则在我看来,Apache函数是最佳选择,因为它返回接收到的确切头信息,而不是一个混淆的CamelCase版本。(还要注意的是,自PHP 5.4起,它不再仅限于Apache。) - Brilliandapache_request_headers()
或getallheaders()
在我的测试中似乎没有将标头名称大写。它们返回的内容与我从客户端传递的完全相同。那么,为什么您在这样一个替换函数中要将标头名称大写呢? - rineez自 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模块运行时使用。
getallheaders()
变得可用。 - d70rr3s将头文件名称传递给此函数,以便无需使用for
循环就能获取其值。如果未找到头,则返回null。
/**
* @var string $headerName case insensitive header name
*
* @return string|null header value or null if not found
*/
function get_header($headerName)
{
$headers = getallheaders();
return isset($headerName) ? $headers[$headerName] : null;
}
注意:此功能仅适用于Apache服务器,请参见:http://php.net/manual/en/function.getallheaders.php
注意:此函数将处理并加载所有标头到内存中,其性能不如for
循环。
如果只需要检索一个键,例如需要"Host"
地址,则可以使用以下方法
apache_request_headers()['Host']
$this->input->get_request_header('X-Requested-With');
strtolower
函数在一些提议的解决方案中缺失,RFC2616(HTTP/1.1)将头字段定义为不区分大小写的实体。整个字段都是如此,而不仅仅是 value 部分。
因此,像仅解析 HTTP_ 条目这样的建议是错误的。
更好的做法是:
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();
}
请注意与之前建议的微妙差别。此处的功能还适用于php-fpm(+nginx)。
Date
头部——以及“参数值[分号后Content-Type中的文本]可能区分大小写,也可能不区分大小写”。因此,考虑到至少有两个具有区分大小写值的头部,似乎你是错误的。 - Joker_vDHTTP头字段包括通用头部(第4.5节)、请求头部(第5.3节)、响应头部(第6.2节)和实体头部(第7.1节),遵循与RFC 822 [9]第3.1节中给出的相同的通用格式。每个头字段由名称后跟冒号(“:”)和字段值组成。字段名称不区分大小写。
- Glenn Plas$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' );
HTTP_
添加到 $headerKey
。 - EECOLOR$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
结果:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive