在 nginx 中,rewrite 指令末尾加 ? 可彻底剔除原始 query string;错误写法保留参数,正确写法如 rewrite ^/old(.*)$ /new$1? permanent;配合 location 与 break 可实现去参后 proxy_pass;复杂参数过滤需用 map 或 if 预处理 $args。

在 Nginx 中,rewrite 指令本身不能直接“剔除”请求参数(query string),因为默认重写时会自动拼接原始 query string。要彻底去掉参数,关键在于重写目标 URL 末尾显式加上一个 问号(?)。
用 ? 截断并丢弃原有参数
Nginx 的 rewrite 规则中,只要重写后的 URL 以 ? 结尾,Nginx 就会清空原始 query string,不带任何参数发起内部重定向或跳转。
-
错误写法(保留参数):
rewrite ^/old(.*)$ /new$1 permanent;→ 请求/old?a=1&b=2会跳到/new?a=1&b=2 -
正确写法(丢弃参数):
rewrite ^/old(.*)$ /new$1? permanent;→ 同样请求跳到/new,无任何 query 参数
配合 location 精确匹配剔除参数再转发
如果只想对特定路径去参后代理到后端(比如 API 接口),可在 location 块中使用 rewrite ... ? + proxy_pass:
- 例如:用户访问
/api/v1/data?id=123&token=abc,但后端不需要参数,只想要/api/v1/data - 配置:
location ^~ /api/v1/data {<br> rewrite ^(.*)$ $1? break;<br> proxy_pass http://backend;<br>} -
break防止后续 location 匹配;$1?清空 query string 后继续处理
仅去除部分参数?需用 map 或 $args 控制
若需保留某些参数、剔除特定几个(如删掉 utm_* 或 ref),单纯 rewrite 不够,得借助 map 指令预处理 $args:
- 先定义过滤逻辑:
map $args $clean_args {<br> default "";<br> "~^(?<a>[^&]*)(?:&(?<b>[^&]*))?(?:&(?<c>[^&]*))?.*$" "$a"; # 示例:仅留第一个参数(实际需按需编写正则)<br>}</c></b></a> - 再在 location 中使用:
rewrite ^/share(.*)$ /share$1?$clean_args? break;(末尾?确保不追加原始 args) - 更稳妥方式是用
if+set构造新$args,但注意if在 location 中有局限,推荐优先用map
rewrite 后跳转 vs 内部重写:注意 flag 选择
是否丢参还取决于 rewrite 的 flag:
-
permanent/redirect:返回 301/302,浏览器地址栏变化,?有效丢参 -
last:内部重定向,重新匹配 location,?同样丢参,适合内部路径清洗 -
break:停止当前 location 的 rewrite 处理,?仍生效,常用于 proxy_pass 前清理参数 - 不加 flag 默认为
last,但显式写清更安全











