为什么特定URL的GET参数无法从Nginx转发到PHP?
解决部分URL无法获取PHP $_GET参数的问题
服务器此前运行正常,未修改NGINX/PHP配置,但出现部分URL无法通过$_GET获取参数的情况:
- 正常URL:
/news/rapido-news?pid=123,可正常获取pid参数 - 异常URL:
/news/amazon-aws-services?pid=432,$_GET为空,新增参数也无效
问题根源
查看你的NGINX配置,问题出在末尾斜杠移除的rewrite规则:
rewrite ^/((?!blackfridaysale)(?!cybermondaysale)(?!review-competition).*)/$ /$1 permanent;
当用户访问带末尾斜杠的URL(如/news/amazon-aws-services/?pid=432)时,该规则会将URL重写为不带斜杠的版本,但未保留查询参数,导致重定向后的URL丢失?pid=432,最终PHP无法获取$_GET参数。
而正常的URL大概率是用户直接访问了不带末尾斜杠的版本,未触发该rewrite规则,因此参数保留完整。
解决方法
修改rewrite规则,在结尾添加?$args以自动携带原查询字符串:
rewrite ^/((?!blackfridaysale)(?!cybermondaysale)(?!review-competition).*)/$ /$1?$args permanent;
$args是NGINX内置变量,会完整保留原URL的查询参数,确保重定向后参数不丢失。
额外检查项
- 确认
fastcgi_params文件中存在以下配置(默认配置已有,若被误改会导致参数无法传递给PHP):fastcgi_param QUERY_STRING $query_string; - 用浏览器开发者工具查看异常URL的网络请求链路,确认是否存在其他未察觉的重定向导致参数丢失。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

