Postman发送的Header未被PHP脚本接收,Nginx/Apache环境求助
解决PHP无法接收Postman发送的请求Header问题
我之前也碰到过一模一样的情况——Postman控制台明明显示Header发出去了,PHP用getallheaders()就是拿不到,Nginx和Apache环境都踩过坑。结合你的场景,大概率是这几个原因导致的,给你整理了对应的解决办法:
1. 下划线Header被服务器拦截了
HTTP标准里其实不建议Header名称用下划线(比如你用的api_token),Nginx默认会直接丢弃带下划线的Header,Apache在默认配置下也会有同样的处理逻辑。
解决思路有两个:
- 改Header名称:把
api_token换成api-token(用连字符替代下划线),这种最省心,也符合HTTP规范; - 修改服务器配置允许下划线Header:
- Nginx:在你的站点配置的
server块或者全局的http块里添加underscores_in_headers on;,然后执行nginx -s reload重启服务; - Apache:在
httpd.conf或者项目根目录的.htaccess里加一行:SetEnvIfNoCase ^api_token$ ^(.*)$ HTTP_API_TOKEN=$1,这样会把下划线的Header映射成PHP能识别的格式,getallheaders()就能拿到了。
- Nginx:在你的站点配置的
2. getallheaders()的兼容性问题
如果PHP是用FPM(FastCGI)模式运行的,getallheaders()在部分环境下会抽风,没法正确获取所有Header。这时候可以换个方式,直接从$_SERVER数组里提取Header——毕竟所有请求Header最终都会被转换成HTTP_开头的$_SERVER变量。
给你一个兼容写法,替换掉原来的代码试试:
<?php function getRequestHeaders() { $headers = []; foreach ($_SERVER as $key => $value) { // 提取所有HTTP_开头的变量 if (str_starts_with($key, 'HTTP_')) { // 把HTTP_API_TOKEN转换成Api-Token这种标准格式 $headerKey = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5))))); $headers[$headerKey] = $value; } } // 处理Content-Type这类特殊Header(有些环境不会转成HTTP_前缀) if (isset($_SERVER['CONTENT_TYPE'])) { $headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; } return $headers; } $headers = getRequestHeaders(); foreach($headers as $key=>$val){ echo $key . ': ' . $val . '<br>'; } ?>
3. 排查Postman的隐性配置问题
虽然你说控制台确认Header已发送,但还是可以检查这两个细节:
- 有没有勾选"Disable follow redirects"?如果你的请求触发了重定向(比如HTTP到HTTPS跳转),Postman默认不会把自定义Header带到重定向后的请求里;
- 测试一下简单的Header值:比如把
api_token的值改成纯英文数字(比如test123),排除特殊字符编码导致的传输丢失问题。
4. 用curl验证,排除Postman的问题
可以用curl命令直接发请求,看看PHP能不能接收到Header,这样能快速定位是Postman的问题还是服务器的问题:
curl -H "api-token: test123" http://你的域名/test.php
如果curl请求能正常返回Header,那问题肯定出在Postman的配置上;如果curl也拿不到,那继续排查服务器和PHP的配置。
内容的提问来源于stack exchange,提问作者wmac
相关产品推荐
相关产品推荐

