Nginx重写规则配置:移除URL尾部斜杠但排除带查询字符串的情况
嘿,这个需求其实很好解决,我们只需要给原有的重写规则加个判断条件,让它只对没有查询字符串的URL生效就行。
你原来的rewrite ^/(.*)/$ /$1;会匹配所有以斜杠结尾的URL,不管后面有没有?xxx这类查询参数,所以会误把/page/?query=xxx也重写成/page?query=xxx,这显然不是你想要的结果。
我们可以利用Nginx的内置变量$is_args——这个变量在URL带有查询字符串时会返回?,没有查询字符串时则是空字符串。基于这个特性,有两种简洁的配置方式:
方式一:用if块包裹(逻辑更直观)
server { # 你的其他server配置(比如listen、server_name等)... if ($is_args = "") { # 仅当无查询字符串时移除尾部斜杠,permanent是301永久重定向,测试阶段可换成redirect(302临时) rewrite ^/(.*)/$ /$1 permanent; } # 你的其他location配置... }
方式二:条件直接写在rewrite后(代码更紧凑)
server { # 你的其他server配置... # 同样是仅无查询字符串时触发重写 rewrite ^/(.*)/$ /$1 permanent if ($is_args = ""); # 你的其他location配置... }
效果验证
配置生效后:
- 访问
https://www.domain.tld/page/(无查询参数):会被301重定向到https://www.domain.tld/page - 访问
https://www.domain.tld/page/?query=xxx(带查询参数):不会触发重写,保留原URL的尾部斜杠
你可以用curl -I命令快速验证:
# 测试无查询参数的情况,应返回301状态码 curl -I https://www.domain.tld/page/ # 测试带查询参数的情况,应返回200(或你配置的业务状态码),无重定向 curl -I https://www.domain.tld/page/?query=xxx
注意:permanent适合生产环境(搜索引擎会更新索引),redirect适合测试阶段;同时确保这个规则放在server块的合适位置,避免被其他location或rewrite规则覆盖。
内容的提问来源于stack exchange,提问作者degdev9
相关产品推荐
相关产品推荐

