在PHP开发中,获取请求头信息是处理接口请求、验证用户身份、识别客户端环境的常见需求,不同场景下可以选择不同的方法来实现。

使用getallheaders函数获取所有请求头
PHP提供了内置的getallheaders函数,可以直接获取当前请求的所有Header头信息,返回的是一个关联数组,键名是请求头的名称,键值是对应的值。需要注意的是,这个函数在FastCGI模式下可能不可用,部分服务器环境需要额外配置才能正常使用。
<?php
// 检查getallheaders函数是否存在
if (function_exists('getallheaders')) {
$headers = getallheaders();
// 遍历输出所有请求头
foreach ($headers as $name => $value) {
echo "Header Name: " . $name . ", Value: " . $value . "<br>";
}
} else {
echo "当前环境不支持getallheaders函数";
}
?>
通过$_SERVER超全局变量获取指定请求头
如果无法使用getallheaders函数,可以通过$_SERVER超全局变量获取指定的请求头信息。请求头在$_SERVER中的键名会遵循特定规则:原请求头名称转为大写,连接符横线替换为下划线,并且前面加上HTTP_前缀。比如请求头User-Agent对应的键名是HTTP_USER_AGENT。
<?php // 获取User-Agent请求头 $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '未知'; echo "User-Agent: " . $userAgent . "<br>"; // 获取自定义请求头X-Token $token = isset($_SERVER['HTTP_X_TOKEN']) ? $_SERVER['HTTP_X_TOKEN'] : '未传递'; echo "X-Token: " . $token . "<br>"; ?>
自定义兼容函数适配不同环境
为了兼容不同服务器环境,可以自定义一个获取所有请求头的函数,优先使用getallheaders,如果不支持则通过$_SERVER变量遍历生成请求头数组。
<?php
function getAllRequestHeaders() {
// 优先使用内置函数
if (function_exists('getallheaders')) {
return getallheaders();
}
$headers = [];
// 遍历$_SERVER变量,筛选HTTP开头的请求头
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
// 处理键名,去掉HTTP_前缀,将下划线替换为横线,转为小写
$headerName = str_replace('_', '-', substr($name, 5));
$headerName = strtolower($headerName);
$headers[$headerName] = $value;
}
}
return $headers;
}
// 调用自定义函数获取请求头
$allHeaders = getAllRequestHeaders();
print_r($allHeaders);
?>
常见注意事项
- 自定义请求头的名称建议遵循规范,不要使用特殊字符,避免在不同环境下出现解析问题。
- 部分代理服务器会过滤或修改请求头,获取到的内容可能和客户端发送的不一致,需要结合实际场景判断。
- 如果请求头包含中文内容,需要注意编码问题,避免出现乱码情况。
- 在获取请求头之前,建议先判断对应的键是否存在,避免出现未定义索引的错误。
不同场景的选择建议
如果是Apache环境且确定getallheaders可用,优先使用该函数,代码更简洁;如果是Nginx+FastCGI环境,建议通过$_SERVER变量获取,或者使用自定义的兼容函数,保证代码的通用性。如果是只需要获取单个请求头,直接使用$_SERVER对应的键获取即可,不需要获取所有请求头,减少不必要的性能消耗。
PHPHeader头信息请求头参数getallheaders修改时间:2026-06-30 20:00:15