NGINX带查询字符串的rewrite重定向被忽略如何解决?
Nginx带查询字符串URL重定向失效解决方案
问题根因
nginx的rewrite指令默认仅匹配URI路径部分(即URL中?之前的内容),查询字符串(?之后的参数)不会被rewrite的匹配规则捕获,因此你现有规则完全匹配不到带page_id参数的请求。
解决方案
方案1:精确匹配单查询参数(推荐,适配你的场景)
直接匹配$args变量(存储完整查询字符串),使用nginx官方推荐的return 301实现重定向,性能优于rewrite,替换你原来的3条rewrite规则即可:
if ($args = "page_id=2966") { return 301 /sustainable-travel?; } if ($args = "page_id=2965") { return 301 /car-sharing?; } if ($args = "page_id=2964") { return 301 /eco-driving?; }
注:目标路径末尾的
?作用是重定向时丢弃原请求的查询字符串,如果你需要保留原参数可以去掉这个问号。
方案2:适配多参数共存场景
如果请求可能携带多个参数,同时包含page_id的情况,可以用正则匹配$args变量:
if ($args ~* "page_id=2966(&|$)") { return 301 /sustainable-travel?; } # 其余page_id的规则以此类推编写即可
生效步骤
- 替换配置中的原有重定向规则
- 执行
nginx -t验证配置语法无错误 - 执行
nginx -s reload重载配置即可生效
内容的提问来源于stack exchange,提问作者owenmelbz
相关产品推荐
相关产品推荐

