getallheaders

(PHP 4, PHP 5, PHP 7, PHP 8)

getallheaders获取所有 HTTP 请求头

说明

getallheaders(): array

从当前请求获取所有 HTTP 头。

此函数是 apache_request_headers() 的别名。请阅读 apache_request_headers() 文档以了解更多关于此函数工作原理的信息。

参数

此函数没有参数。

返回值

当前请求中所有 HTTP 头的关联数组,或者在失败时为 false

变更日志

版本 说明
7.3.0 此函数在 FPM SAPI 中可用。

示例

示例 #1 getallheaders() 示例

<?php

foreach (getallheaders() as $name => $value) {
echo
"$name: $value\n";
}

?>

参见

添加说明

用户贡献说明 9 条说明

joyview at gmail dot com
16 年前
如果您使用的是 nginx 而不是 apache,这可能很有用

<?php
if (!function_exists('getallheaders'))
{
function
getallheaders()
{
$headers = [];
foreach (
$_SERVER as $name => $value)
{
if (
substr($name, 0, 5) == 'HTTP_')
{
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return
$headers;
}
}
?>
michaelmcandrew at thirdsectordesign dot org
4 年前
一种处理不区分大小写的标题(根据 RFC2616)的简单方法是使用内置的 array_change_key_case() 函数

$headers = array_change_key_case(getallheaders(), CASE_LOWER);
匿名
8 年前
有一个 polyfill 可以下载或通过 composer 安装

https://github.com/ralouphie/getallheaders
lorro at lorro dot hu
19 年前
请注意,RFC2616(HTTP/1.1)将报头字段定义为不区分大小写的实体。因此,应首先将 getallheaders() 的数组键转换为小写或大写,并以这种方式进行处理。
acidfilez at gmail dot com
13 年前
不要忘记在上传文件时添加 content_type 和 content_lenght

<?php
function emu_getallheaders() {
foreach (
$_SERVER as $name => $value)
{
if (
substr($name, 0, 5) == 'HTTP_')
{
$name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))));
$headers[$name] = $value;
} else if (
$name == "CONTENT_TYPE") {
$headers["Content-Type"] = $value;
} else if (
$name == "CONTENT_LENGTH") {
$headers["Content-Length"] = $value;
}
}
return
$headers;
}
?>

chears magno c. heck
majksner at gmail dot com
13 年前
apache_request_headers 的 nginx 替代品

<?php
if (!function_exists('apache_request_headers')) {
function
apache_request_headers() {
foreach(
$_SERVER as $key=>$value) {
if (
substr($key,0,5)=="HTTP_") {
$key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5)))));
$out[$key]=$value;
}else{
$out[$key]=$value;
}
}
return
$out;
}
}
?>
divinity76 at gmail dot com
1 年前
警告,至少在 php-fpm 8.2.1 和 nginx 上,getallheaders() 将返回 "Content-Length" 和 "Content-Type" 两个都包含空字符串,即使对于没有这两个头中的任何一个的请求也是如此。你可以做类似的事情

<?php
$request_headers
= getallheaders();
if((
$request_headers["Content-Type"] ?? null) === "" && ($request_headers["Content-Length"] ?? null) === "") {
// 可能是 getallheaders() 的 bug,不是实际的请求头。
unset($request_headers["Content-Type"], $request_headers["Content-Length"]);
}
?>

- 可能是 nginx 而不是 php-fpm 中的 bug,我不知道。无论如何,真正的请求不会将它们留为空字符串
Dimitri
2 年前
从标头中检索令牌

<?php
function getAuthorizationHeader(){
$headers = null;
if (isset(
$_SERVER['Authorization'])) {
$headers = trim($_SERVER["Authorization"]);
}
elseif (isset(
$_SERVER['HTTP_AUTHORIZATION'])) {
$headers = trim($_SERVER["HTTP_AUTHORIZATION"]);
}
elseif (
function_exists('apache_request_headers')) {
$requestHeaders = apache_request_headers();
$requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));

if (isset(
$requestHeaders['Authorization'])) {
$headers = trim($requestHeaders['Authorization']);
}
}

return
$headers;
}

function
getBearerToken() {
$headers = getAuthorizationHeader();

if (!empty(
$headers)) {
if (
preg_match('/Bearer\s(\S+)/', $headers, $matches)) {
return
$matches[1];
}
}

return
null;
}

echo
getBearerToken();
?>
andersmyren at hotmail dot com
5 年前
由于 else 部分。
} else {
$out[$key]=$value;
所有服务器变量都添加到 headers 列表中,这不是期望的结果。
To Top