如何针对特定查询字符串规则配置Nginx Rewrite重定向?
解决Nginx根路径多参数URL重定向问题
问题背景
主站点收到大量根路径下带额外参数的请求,参数组合多样导致缓存混乱,需配置重定向规则:
- 所有根路径下包含
lang=zh-hans且带有其他参数的URL,重定向至/?lang=zh-hans - 所有根路径下包含
lang=zh-hant且带有其他参数的URL,重定向至/?lang=zh-hant
需重定向到/?lang=zh-hans的请求示例:
/?lang=zh-hans&category=26%2C27&full=1&mo=9&yr=2022&id=1800312749 /?lang=zh-hans&category=26%2C27&full=1&mo=8&yr=2022&id=111871000 /?lang=zh-hans&id=1930613962&category=26%2C27&full=1&mo=10&yr=2022 /?lang=zh-hans&category=26%2C27&full=1&mo=08&yr=2022&id=1205387849
需重定向到/?lang=zh-hant的请求示例:
/?lang=zh-hant&category=26%2C27&full=1&mo=9&yr=2022&id=1800312749 /?lang=zh-hant&category=26%2C27&full=1&mo=8&yr=2022&id=111871000 /?lang=zh-hant&id=1930613962&category=26%2C27&full=1&mo=10&yr=2022 /?lang=zh-hant&category=26%2C27&full=1&mo=08&yr=2022&id=1205387849
无效配置分析
之前尝试的配置无法生效:
rewrite ^/?lang=zh-hans&category=.+ /?lang=zh-hans permanent;
原因:Nginx的rewrite指令默认仅匹配URI的路径部分(即?之前的内容),不会包含查询参数,因此直接用正则匹配查询参数的写法不生效。
正确配置方案
方案一:基于参数变量的精准匹配
server { # 保留原有server配置... # 精准匹配根路径请求 location = / { # 处理zh-hans多参数重定向 if ($arg_lang = zh-hans) { # 匹配lang=zh-hans在开头/中间/结尾且存在其他参数的情况 if ($args ~* "^lang=zh-hans&.+$|^.+&lang=zh-hans(&.+)?$") { return 301 /?lang=zh-hans; } } # 处理zh-hant多参数重定向 if ($arg_lang = zh-hant) { if ($args ~* "^lang=zh-hant&.+$|^.+&lang=zh-hant(&.+)?$") { return 301 /?lang=zh-hant; } } # 根路径原有业务逻辑配置... } }
方案二:简洁的查询参数正则匹配
server { # 保留原有server配置... location = / { # 匹配带zh-hans且存在其他参数的请求,排除已为目标URL的情况 if ($args ~* "^lang=zh-hans(&.*)?$" && $args !~ "^lang=zh-hans$") { return 301 /?lang=zh-hans; } # 匹配带zh-hant且存在其他参数的请求,排除已为目标URL的情况 if ($args ~* "^lang=zh-hant(&.*)?$" && $args !~ "^lang=zh-hant$") { return 301 /?lang=zh-hant; } # 根路径原有业务逻辑配置... } }
配置说明
location = /:精准匹配根路径请求,避免影响其他路径的正常访问$arg_lang:Nginx内置变量,直接获取查询参数中lang的值$args:Nginx内置变量,存储所有查询参数字符串return 301:实现永久重定向(若需临时重定向可替换为302)- 额外的正则条件:避免已经是
/?lang=zh-hans或/?lang=zh-hant的请求被重复重定向
内容的提问来源于stack exchange,提问作者Jason Ching
相关产品推荐
相关产品推荐

