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
相关产品推荐
相关产品推荐

