PHP apache_request_headers()函数

PHP apache_request_headers() 函数

apache_request_headers() 函数用于获取当前请求的所有 HTTP 请求头信息。

提示: 该函数仅在 Apache 服务器环境下可用。如果使用其他服务器(如 Nginx),可以考虑使用 getallheaders() 函数或 $_SERVER 超全局变量。

语法

apache_request_headers ( ) : array

该函数没有参数。

返回值

函数返回一个包含所有 HTTP 请求头的关联数组,失败则返回 FALSE

返回的数组格式如下:

  • 键名(Key):HTTP 请求头的名称(如 "Accept", "User-Agent", "Content-Type" 等)
  • 键值(Value):对应请求头的值

示例 1:获取所有 HTTP 请求头

下面的示例演示如何使用 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 请求头信息:
  • Host: example.com
  • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
  • 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
  • Connection: keep-alive
  • Cache-Control: max-age=0

示例 2:检查特定 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>";
}
?>

示例 3:处理大小写不敏感的键名

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 服务器环境下有效。
  • 大小写敏感性:HTTP 请求头名称是大小写不敏感的,但函数返回的数组键名会保留原始大小写。
  • 性能考虑:在处理大量请求时,频繁调用此函数可能会影响性能。
  • 替代方案:如果服务器不是 Apache,可以使用 $_SERVER 超全局变量来获取请求头信息。
  • PHP 版本:该函数自 PHP 4.3.0 版本开始可用。

相关函数