apache_request_headers() 函数用于获取当前请求的所有 HTTP 请求头信息。
getallheaders() 函数或 $_SERVER 超全局变量。
apache_request_headers ( ) : array
该函数没有参数。
函数返回一个包含所有 HTTP 请求头的关联数组,失败则返回 FALSE。
返回的数组格式如下:
下面的示例演示如何使用 apache_request_headers() 函数获取所有 HTTP 请求头并打印出来。
<?php
// 获取所有 HTTP 请求头
$headers = apache_request_headers();
// 检查是否成功获取
if ($headers !== false) {
echo "<h3>HTTP 请求头信息:</h3>";
echo "<ul>";
// 遍历并打印所有请求头
foreach ($headers as $header => $value) {
echo "<li><strong>$header</strong>: $value</li>";
}
echo "</ul>";
} else {
echo "无法获取 HTTP 请求头信息";
}
?>
运行结果示例:
下面的示例演示如何检查特定的 HTTP 请求头,如 "User-Agent" 或 "Accept-Language"。
<?php
// 获取所有 HTTP 请求头
$headers = apache_request_headers();
// 检查用户代理
if (isset($headers['User-Agent'])) {
$userAgent = $headers['User-Agent'];
echo "用户代理: $userAgent<br>";
// 简单检测浏览器类型
if (strpos($userAgent, 'Chrome') !== false) {
echo "检测到 Chrome 浏览器<br>";
} elseif (strpos($userAgent, 'Firefox') !== false) {
echo "检测到 Firefox 浏览器<br>";
} elseif (strpos($userAgent, 'Safari') !== false) {
echo "检测到 Safari 浏览器<br>";
}
}
// 检查接受的语言
if (isset($headers['Accept-Language'])) {
$acceptLanguage = $headers['Accept-Language'];
echo "接受的语言: $acceptLanguage<br>";
// 提取首选语言
$languages = explode(',', $acceptLanguage);
if (count($languages) > 0) {
$primaryLanguage = trim(explode(';', $languages[0])[0]);
echo "首选语言: $primaryLanguage<br>";
}
}
// 检查内容类型(仅适用于 POST/PUT 请求)
if (isset($headers['Content-Type'])) {
echo "内容类型: " . $headers['Content-Type'] . "<br>";
}
?>
HTTP 请求头名称是大小写不敏感的。下面的示例演示如何处理这种情况。
<?php
// 获取所有 HTTP 请求头
$headers = apache_request_headers();
// 标准化所有键名为小写,便于查找
$headersLower = array_change_key_case($headers, CASE_LOWER);
// 现在可以忽略大小写查找请求头
if (isset($headersLower['user-agent'])) {
echo "用户代理: " . $headersLower['user-agent'] . "<br>";
}
if (isset($headersLower['accept-language'])) {
echo "接受的语言: " . $headersLower['accept-language'] . "<br>";
}
// 使用辅助函数获取请求头(忽略大小写)
function getRequestHeader($name) {
$headers = apache_request_headers();
$headersLower = array_change_key_case($headers, CASE_LOWER);
$nameLower = strtolower($name);
return isset($headersLower[$nameLower]) ? $headersLower[$nameLower] : null;
}
// 使用辅助函数
$contentType = getRequestHeader('Content-Type');
if ($contentType) {
echo "内容类型: $contentType<br>";
}
?>
如果你需要在非 Apache 服务器环境下获取 HTTP 请求头,可以使用以下方法:
<?php
/**
* 获取所有 HTTP 请求头(跨服务器兼容版本)
* @return array 包含所有 HTTP 请求头的关联数组
*/
function getAllHeadersCompatible() {
// 尝试使用 apache_request_headers()
if (function_exists('apache_request_headers')) {
$headers = apache_request_headers();
if ($headers !== false) {
return $headers;
}
}
// 尝试使用 getallheaders()(某些Apache服务器也支持)
if (function_exists('getallheaders')) {
$headers = getallheaders();
if (!empty($headers)) {
return $headers;
}
}
// 从 $_SERVER 超全局变量中提取
$headers = [];
foreach ($_SERVER as $key => $value) {
// 提取以 "HTTP_" 开头的服务器变量
if (substr($key, 0, 5) == 'HTTP_') {
// 转换格式:HTTP_CONTENT_TYPE => Content-Type
$header = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($key, 5)))));
$headers[$header] = $value;
}
// 处理特殊情况:CONTENT_TYPE 和 CONTENT_LENGTH
elseif (in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH'])) {
$header = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));
$headers[$header] = $value;
}
}
return $headers;
}
// 使用兼容函数
$headers = getAllHeadersCompatible();
echo "<h3>HTTP 请求头信息(兼容版本):</h3>";
foreach ($headers as $header => $value) {
echo "<strong>$header</strong>: $value<br>";
}
?>
apache_request_headers() 函数仅在 Apache 服务器环境下有效。$_SERVER 超全局变量来获取请求头信息。