PHP中$_SERVER['REQUEST_METHOD']为GET时header设置失效问题
问题原因分析
1. Nginx未正确传递REQUEST_METHOD参数给PHP-FPM
这是最可能的核心原因:如果你的Nginx配置中缺少fastcgi_param REQUEST_METHOD $request_method;这一行,PHP的$_SERVER['REQUEST_METHOD']变量会未定义。此时访问该变量会触发Notice级错误,错误输出会先于header()调用发送到客户端——HTTP头必须在任何内容输出前发送,一旦有错误输出,PHP会自动发送默认的text/html头,后续的header()调用会直接失效。
而当你用1==1的条件时,不会触发这个错误,header()能正常发送,所以Content-Type会被正确设置为application/json。
验证与修复:
- 临时开启错误输出排查:在PHP脚本开头添加以下代码,用GET请求访问,若页面显示
Notice: Undefined index: REQUEST_METHOD,则确认是该问题:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); if ($_SERVER['REQUEST_METHOD'] == 'GET') { header("Content-Type: application/json"); echo '{"name":"Larry","town":"Pungaville"}'; }
- 检查Nginx配置:打开
fastcgi_params文件或站点配置的location ~ \.php$块,确保包含以下配置:
fastcgi_param REQUEST_METHOD $request_method;
添加后重启Nginx即可生效。
2. 实际请求方法并非GET
可能你测试时误发送了非GET请求(比如浏览器的OPTIONS预检请求、curl误加POST参数),此时$_SERVER['REQUEST_METHOD'] == 'GET'条件不成立,header()不会被调用,PHP默认发送text/html头。但你提到两种情况数据均正常输出,所以该可能性较低。可以用curl -v http://你的域名/脚本路径.php查看请求方法,确认是否为GET。
3. PHP输出缓冲或错误处理的特殊干扰
如果PHP的output_buffering配置开启,但某些错误输出绕过了缓冲,也可能导致头被覆盖。不过这种情况在1==1条件下也会出现问题,所以可能性较低。可以在脚本开头添加ob_start();强制开启缓冲,测试是否解决问题。
内容的提问来源于stack exchange,提问作者64bitFrog
相关产品推荐
相关产品推荐

