PHP Conference Japan 2024

getallheaders

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

getallheaders获取所有 HTTP 请求头

描述

getallheaders(): 数组

获取当前请求中的所有 HTTP 头。

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

参数

此函数没有参数。

返回值

当前请求中所有 HTTP 头的关联数组。

变更日志

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

范例

示例 #1 getallheaders() 示例

<?php

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

?>

参见

添加注释

用户贡献的注释 7 条注释

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_length

<?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
14 年前
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",即使请求中没有这两个 header 也是如此。你可以这样做:

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

- 这可能是 nginx 的 bug,而不是 php-fpm 的 bug,我不确定。无论如何,真实的请求不会让它们为空字符串。
To Top