You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:$_SERVER['HTTP_TEST']返回空值且apache_get_headers检测不到该请求头

解决PHP无法获取自定义请求头的问题

我之前在项目里也踩过一模一样的坑,折腾了好半天,给你梳理几个最可能的原因和对应的解决办法:

  • 请求头带下划线被服务器过滤:这是最常见的坑!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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:58:29