
当从客户端(如java应用程序)发送自定义http头部到php服务端时,开发者可能会发现原始头部名称在php的$_server超全局变量中发生了变化。例如,一个名为x-auth-hmac的头部会变为http_x_auth_hmac。这种转换并非偶然或错误,而是遵循了cgi 1.1规范(rfc 3875)中的标准行为。
根据RFC 3875的第4.1.18节规定:
那些以HTTP_开头的元变量包含从客户端请求头部字段读取的值,如果使用的协议是HTTP。HTTP头部字段名会被转换为大写,所有出现的连字符-会被替换为下划线_,并预先添加HTTP_以形成元变量名。
这意味着,所有非标准(即非Content-Type、Content-Length等)的HTTP请求头部,在通过CGI或FastCGI接口传递给PHP时,都会经过以下三步转换:
因此,X-Auth-HMAC头部在PHP的$_SERVER中最终会以HTTP_X_AUTH_HMAC的形式出现。
以下是一个使用Java HttpClient发送自定义X-Auth-HMAC头部的示例代码:
立即学习“PHP免费学习笔记(深入)”;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
public class HttpClientExample {
public static void main(String[] args) {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://php-fpm:80")) // 替换为你的PHP服务地址
.header("Content-Type", "application/json")
.header("X-Auth-HMAC", "test_hmac_header_value") // 自定义头部
.POST(HttpRequest.BodyPublishers.ofString("{\"message\":\"hello from java\"}"))
.build();
CompletableFuture<HttpResponse<String>> responseFuture = client.sendAsync(
request,
HttpResponse.BodyHandlers.ofString()
);
responseFuture.thenAccept(response -> {
System.out.println("Status Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}).join(); // 等待异步操作完成
}
}在这个示例中,我们明确地设置了一个名为X-Auth-HMAC的头部,其值为test_hmac_header_value。
当上述Java客户端请求到达PHP服务端时,PHP可以通过$_SERVER超全局变量访问到这些头部信息。然而,正如前面所解释的,X-Auth-HMAC将变为HTTP_X_AUTH_HMAC。
在PHP脚本中,你可以这样验证:
<?php
// 打印所有 $_SERVER 变量,观察 HTTP 头部
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
// 直接访问转换后的头部
if (isset($_SERVER['HTTP_X_AUTH_HMAC'])) {
$hmacHeader = $_SERVER['HTTP_X_AUTH_HMAC'];
echo "从 \$ _SERVER 获取的 X-Auth-HMAC 值: " . $hmacHeader . "\n";
} else {
echo "HTTP_X_AUTH_HMAC 头部未找到。\n";
}
// 进一步展示其他获取头部的方法
echo "\n--- 使用 getallheaders() 获取所有头部 ---\n";
if (function_exists('getallheaders')) {
$headers = getallheaders();
print_r($headers);
if (isset($headers['X-Auth-HMAC'])) {
echo "从 getallheaders() 获取的 X-Auth-HMAC 值: " . $headers['X-Auth-HMAC'] . "\n";
}
} else {
echo "getallheaders() 函数不可用 (例如在某些 PHP SAPI 环境下)。\n";
}
?>运行上述PHP脚本,你将会在$_SERVER的输出中看到类似以下内容:
[
...
"HTTP_HOST" => "php-fpm:80",
"HTTP_CONTENT_TYPE" => "application/json",
"HTTP_X_AUTH_HMAC" => "test_hmac_header_value", // 转换后的自定义头部
...
]
从 $_SERVER 获取的 X-Auth-HMAC 值: test_hmac_header_value
--- 使用 getallheaders() 获取所有头部 ---
Array
(
[Host] => php-fpm:80
[Content-Type] => application/json
[X-Auth-HMAC] => test_hmac_header_value // 原始名称的自定义头部
)
从 getallheaders() 获取的 X-Auth-HMAC 值: test_hmac_header_value在PHP中,主要有两种方式来获取HTTP请求头部:
$_SERVER 超全局变量: 这是最常见且始终可用的方法。如前所述,自定义头部会经过RFC 3875的转换规则,即添加HTTP_前缀,转换为大写,并用下划线替换连字符。
getallheaders() 函数: 这个函数会返回一个关联数组,其中键是原始的HTTP头部名称(例如X-Auth-HMAC),值是对应的头部内容。
自定义HTTP头部在从Java客户端发送到PHP服务端时,其名称在$_SERVER超全局变量中发生变化,是遵循RFC 3875(CGI 1.1规范)的标准化行为。具体表现为添加HTTP_前缀、转换为大写、并将连字符替换为下划线。开发者在PHP中访问这些头部时,应根据$_SERVER的命名规则进行匹配,或在确认环境支持的情况下,使用getallheaders()函数获取原始头部名称。理解这一转换机制对于构建稳定可靠的跨语言通信至关重要。
以上就是HTTP自定义头部在PHP中的命名转换:RFC 3875解析的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号