Nginx 中彻底移除原始查询参数需在 rewrite 目标末尾加 ?,如 rewrite ^/old/(.)$ /new/$1?;仅重写路径则不加 ? 并用 last,如 rewrite ^/api/v1/(.)$ /v2/$1 last;路径内参数可用正则捕获并重用。

在 Nginx 中,请求路径中参数的“截断”与“重写”并非标准术语,实际指两类常见需求:一是去除原始 URL 中的查询参数(如 ?a=1&b=2),二是对路径部分(location 匹配段)进行改写或提取。Nginx 本身不直接“截断参数”,但可通过配置控制是否保留、丢弃或替换查询字符串。
如何彻底移除原始查询参数
Nginx 默认会将原始请求中的查询参数($args)自动追加到重写后的 URL 后。若需完全清空参数,必须显式指定空查询串或使用 ? 结尾来截断。
- 用
rewrite ...?;(末尾问号)可丢弃所有原始参数 - 用
rewrite ...?foo=bar;可替换为新参数 - 用
rewrite ... last;(无问号)则保留原始参数
例如:
rewrite ^/old/(.*)$ /new/?; # 去掉所有参数,跳转到 /new/xxx
只重写路径、保留原有参数
当只需调整路径结构,又希望用户传入的 ?key=value 仍透传给后端时,避免在 rewrite 目标末尾加 ?。
-
rewrite ^/api/v1/(.*)$ /v2/$1 last;→ 请求/api/v1/user?id=123变成/v2/user?id=123 - 注意:
last触发内部重定向,redirect或permanent则返回 301/302 给客户端
提取并重用路径中的参数(非 query 参数)
如果参数藏在路径里(如 /user/123/detail),可用正则捕获,再拼入新路径或传递给后端。
rewrite ^/user/(\d+)/(.*)$ /api/users/$1/$2 break;- 搭配
proxy_set_header X-User-ID $1;可把捕获值传给上游 -
break阻止后续 rewrite,适合配合proxy_pass使用
用 map 模块实现条件性参数处理
对于复杂逻辑(如仅当存在某参数时才重写),建议用 map 预先定义变量,再在 location 中引用。
- 在 http 块中定义:
map $args $should_strip {
~*utm_source=.* 1;
default 0;
} - 在 location 中:
if ($should_strip) {
rewrite ^(.*)$ $1? redirect;
}


















