apache_request_headers

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

apache_request_headers获取所有 HTTP 请求头

描述

apache_request_headers(): array

从当前请求中获取所有 HTTP 请求头。在 Apache、FastCGI、CLI 和 FPM 服务器中运行。

参数

此函数没有参数。

返回值

当前请求中所有 HTTP 头的关联数组,如果失败则返回 false

变更日志

版本 描述
7.3.0 此函数在 FPM SAPI 中可用。

示例

示例 #1 apache_request_headers() 示例

<?php
$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

注释

注意:

您还可以通过从环境中读取它们来获取常见 CGI 变量的值,无论您是否使用 PHP 作为 Apache 模块。使用 phpinfo() 查看所有可用的 环境变量 列表。

参见

添加注释

用户贡献的注释 6 则注释

10
Tel
4 年前
虽然我们期望看到大小写混合的头,但标准 RFC2616 要求“字段名称不区分大小写”。PHP 以客户端发送的原始方式完全保留头。您可能需要预期任何类型的大写、小写或混合情况。

因此,如果您想符合标准,您必须循环遍历每个键并以不区分大小写的方式检查它,而不是做明显的事情并使用头名称作为数组索引。
10
limalopex.eisfux.de
17 年前
我在 PHP::Compat (http://pear.php.net/package/PHP_Compat) 中没有找到 apache_request_headers() 的替代方法,所以我写了自己的。

<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach(
$_SERVER as $key => $val) {
if(
preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// 对字符串进行一些不好的操作来恢复原始的字母大小写
// 这在大多数情况下应该可以工作
$rx_matches = explode('_', $arh_key);
if(
count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach(
$rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return(
$arh );
}
///
}
///
?>
8
callum85 at notspam dot msn dot com
17 年前
即使在 PHP 作为 CGI 运行时,也有一个简单的方法可以从 Apache 获取请求头。据我所知,这是在 apache_request_headers() 不可用时获取“If-Modified-Since”和“If-None-Match”头的唯一方法。您需要 mod_rewrite,大多数网络主机似乎都启用了它。将此放在您的 Web 根目录中的 .htaccess 文件中

RewriteEngine on
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

然后,可以在 PHP 中以以下方式获取这些头
<?php
$_SERVER
['HTTP_IF_MODIFIED_SINCE'];
$_SERVER['HTTP_IF_NONE_MATCH'];
?>

我在 PHP/5.1.6 上测试过,在 Apache/2.2.3/Win32 和 Apache/2.0.54/Unix 上都完美运行。

注意:如果您已经使用 RewriteRules 来实现简洁的 URL,则需要将上面的规则放在您现有的规则之后。
5
egocentryk
9 年前
所有缺少 getallheaders() 的补丁中使用的超全局变量 $_SERVER 仅包含真正基本的头。要将任何头传递到任何 httpd 环境中的 PHP,包括 CGI/FCGI,只需将规则(任意数量的规则)添加到 .htaccess 中

RewriteRule .* - [E=HTTP_MY_HEADER:%{HTTP:My-Header}]

头及其值将以以下方式显示在 PHP 中
<?php print $_SERVER['HTTP_MY_HEADER']; ?>

而且……就是忍不住。重写 $_SERVER 键以替换缺少的函数实际上不需要正则表达式、preg_matches 或 evals……试试这个
<?php
function getallheaders() {
foreach(
$_SERVER as $K=>$V){$a=explode('_' ,$K);
if(
array_shift($a)=='HTTP'){
array_walk($a,function(&$v){$v=ucfirst(strtolower($v));});
$retval[join('-',$a)]=$V;}
} return
$retval; }
?>
0
gilles at sdv dot fr
1 年前
函数 apache_request_headers 在 FCGI PHP-FPM 中不存在

使用此补丁:https://gist.github.com/rmpel/11583cfddfcc9705578428e3a2ee3dc1

<?php
// 当 apache_request_headers() 不可用时,将其替换为 drop-in

if ( ! function_exists( 'apache_request_headers' ) ) {
function
apache_request_headers() {
static
$arrHttpHeaders;
if ( !
$arrHttpHeaders ) {

// 基于:http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
$arrCasedHeaders = array(
// HTTP
'Dasl' => 'DASL',
'Dav' => 'DAV',
'Etag' => 'ETag',
'Mime-Version' => 'MIME-Version',
'Slug' => 'SLUG',
'Te' => 'TE',
'Www-Authenticate' => 'WWW-Authenticate',
// MIME
'Content-Md5' => 'Content-MD5',
'Content-Id' => 'Content-ID',
'Content-Features' => 'Content-features',
);
$arrHttpHeaders = array();

foreach (
$_SERVER as $strKey => $mixValue ) {
if (
'HTTP_' !== substr( $strKey, 0, 5 ) ) {
continue;
}

$strHeaderKey = strtolower( substr( $strKey, 5 ) );

if (
0 < substr_count( $strHeaderKey, '_' ) ) {
$arrHeaderKey = explode( '_', $strHeaderKey );
$arrHeaderKey = array_map( 'ucfirst', $arrHeaderKey );
$strHeaderKey = implode( '-', $arrHeaderKey );
} else {
$strHeaderKey = ucfirst( $strHeaderKey );
}

if (
array_key_exists( $strHeaderKey, $arrCasedHeaders ) ) {
$strHeaderKey = $arrCasedHeaders[ $strHeaderKey ];
}

$arrHttpHeaders[ $strHeaderKey ] = $mixValue;
}

/** 如果你需要授权并且你的托管服务提供商还没有为你修复这个问题:
* VHOST-Config:
* FastCgiExternalServer 行需要 -pass-header Authorization
*
* .htaccess 或 VHOST-config 文件需要:
* SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
* 将 Authorization 标头添加到环境中以供进一步处理
*/
if ( ! empty( $arrHttpHeaders['Authorization'] ) ) {
// 如果有授权,但值没有正确传播,那就这样做 :)
if ( ! isset( $_SERVER['PHP_AUTH_USER'] ) ) {
list(
$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] ) = explode( ':', base64_decode( substr( $_SERVER['HTTP_AUTHORIZATION'], 6 ) ) );
}
}
}

return
$arrHttpHeaders;
}

// 现在执行,这样其他脚本就不太可能污染 $_SERVER 中的信息
// 数据被缓存,因此多次检索标头不会对性能产生进一步的影响。
apache_request_headers();
}
-12
uli dot staerk at globalways dot net
9 年前
limalopex.eisfux.de 的一个略微修改的版本。修复了缺少的标头 Content-Type 和 Content-Length,并将其更改为 Camel-Case。

<?php
if( !function_exists('apache_request_headers') ) {
function
apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach(
$_SERVER as $key => $val) {
if(
preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// 执行一些糟糕的字符串操作以恢复原始字母大小写
// 这在大多数情况下应该有效
$rx_matches = explode('_', strtolower($arh_key));
if(
count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach(
$rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
if(isset(
$_SERVER['CONTENT_TYPE'])) $arh['Content-Type'] = $_SERVER['CONTENT_TYPE'];
if(isset(
$_SERVER['CONTENT_LENGTH'])) $arh['Content-Length'] = $_SERVER['CONTENT_LENGTH'];
return(
$arh );
}
}
To Top