求助:$_SERVER['HTTP_TEST']返回空值且apache_get_headers检测不到该请求头
我之前在项目里也踩过一模一样的坑,折腾了好半天,给你梳理几个最可能的原因和对应的解决办法:
请求头带下划线被服务器过滤:这是最常见的坑!Apache默认会丢弃带下划线的自定义请求头(因为它认为下划线是非标准格式)。如果你的请求头是
Test还好,但如果是My_Test这类带下划线的就会被直接吃掉。解决办法要么把请求头改成不带下划线的格式(比如X-My-Test这种标准自定义头格式),要么修改Apache配置,添加HttpProtocolOptions Unsafe然后重启Apache;如果是Nginx环境,在配置里加underscores_in_headers on;就能解决。反向代理没转发请求头:如果你的PHP服务前面有Nginx、Cloudflare这类代理,很可能代理没把自定义请求头传递到后端。比如Nginx里需要显式配置
proxy_set_header Test $http_test;(把前端发的Test头转发给后端),不然代理会自动过滤掉非标准请求头。PHP配置限制导致无法读取:检查php.ini里的
variables_order配置,确保里面包含E(代表环境变量)——$_SERVER里的HTTP头其实是从环境变量解析来的。如果variables_order是"GPCS"(缺了E),那$_SERVER里就拿不到这些请求头。改成variables_order = "GPCSHE"后重启PHP服务就行。请求发送本身有问题:先确认前端是不是真的把请求头发出去了。比如用Chrome开发者工具的Network面板,查看请求的Headers部分,确认
Test头存在。如果是跨域请求,自定义头会触发OPTIONS预检请求,这时候服务器必须返回Access-Control-Allow-Headers: Test才能让浏览器发送实际请求,不然请求头根本到不了后端。
另外给你个调试小技巧:在PHP里用var_dump(getallheaders());打印所有能获取到的请求头,比apache_get_headers()更通用(不管是Apache还是Nginx环境都能用)。也可以直接看Web服务器的访问日志,日志里会记录完整的请求头,能快速确认请求头到底有没有被服务器接收到。
内容的提问来源于stack exchange,提问作者namratha

