$_SERVER键中出现重复HTTP_前缀的原因排查
AJAX自定义请求头出现重复HTTP_前缀的排查分析
我通过jQuery AJAX向服务器发送请求,设置的请求头如下:
headers: { 'X-FOO': 'x_foo', 'X-BAR': $( 'input[name=x_bar]' ).val(), }
在服务器端的$_SERVER全局变量中,大部分请求头都正常解析,但唯独X-BAR头被添加了重复的HTTP_前缀,相关内容如下:
... [HTTP_ACCEPT_ENCODING] => gzip, deflate, br [HTTP_ACCEPT_LANGUAGE] => en-GB,en;q=0.9 [HTTP_X_FOO] => x_foo [HTTP_HTTP_X_BAR] => my_value [HTTP_X_REQUESTED_WITH] => XMLHttpRequest [HTTP_ACCEPT] => */* ...
当前环境为NGINX部署,无CMS等额外干扰,仅使用纯PHP/jQuery,且已100%确认AJAX请求头中未添加额外前缀。
可能的原因
- NGINX请求头转发配置错误:这是最常见的诱因。如果NGINX配置里用
proxy_set_header或fastcgi_param处理X-BAR头时逻辑出错,比如写了proxy_set_header HTTP_X-BAR $http_x_bar;,NGINX会在转发请求时给原本的X-BAR头再套一层HTTP_前缀,最终PHP接收到的键名就变成了HTTP_HTTP_X_BAR。 - FastCGI参数配置异常:若PHP通过FastCGI与NGINX通信,部分FastCGI参数配置可能对特定请求头做了重复的格式转换,不过这种情况概率较低,优先排查NGINX的请求头转发规则。
- 浏览器端工具篡改:虽然已确认AJAX代码,但可以通过浏览器开发者工具的Network面板,查看实际发送的请求头内容,确认是否在发送环节就出现了重复前缀,排除浏览器扩展或代理工具的干扰。
内容的提问来源于stack exchange,提问作者user3934058
相关产品推荐
相关产品推荐

