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

Nginx重写PHP页面时GET参数字符串值为何异常变化?

问题原因分析

这是因为Nginx在两种访问场景下对URL参数的处理逻辑存在差异:

  • 直接访问/search.php?q=query+here时,Nginx会自动解码查询参数,将URL中的+转换为空格后再传递给PHP,因此$_GET['q']输出query here。
  • 通过rewrite规则跳转时,Nginx只是把捕获到的原始字符串query+here直接拼接到目标URL中,没有对这部分内容执行URL解码操作,导致PHP接收到未解码的原始字符串,最终输出保留了+号。
解决方案

修改Nginx重写规则,在目标URL末尾添加?,触发Nginx对拼接后的查询参数进行自动解码:

location /s/ {
    rewrite ^/s/(.+)$ /search.php?q=$1? last;
}

这里的?作用是告知Nginx,将拼接后的q=$1作为新的查询字符串处理,执行默认的URL解码逻辑,这样PHP拿到的$_GET['q']就会和直接访问原始URL的结果一致。

如果你的Nginx版本在1.19.0及以上,也可以使用uri_decoded变量显式解码:

location /s/ {
    set $decoded_query $uri_decoded;
    rewrite ^/s/(.+)$ /search.php?q=$decoded_query last;
}

不过第一种加?的方法兼容性更强,无需依赖特定Nginx版本。

内容的提问来源于stack exchange,提问作者johnnyApplePRNG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:30:04