nginx rewrite默认不透传url参数,需显式添加$?args或$query_string才能保留;使用permanent/redirect时同理;拼接固定参数需用&连接且注意$?args为空时不会多余输出。

在 Nginx 中做 rewrite 时,默认情况下 URL 参数(query string)不会自动透传到新路径,需要显式配置才能保留原有参数。这是常见误区,导致重写后丢失 ?a=1&b=2 这类参数。
rewrite 指令默认不带参数透传
Nginx 的 rewrite 指令默认只重写路径部分(URI),不处理 query string。例如:
rewrite ^/old/(.*)$ /new/$1;访问 /old/test?a=1&b=2 会被重写为 /new/test,但 ?a=1&b=2 会丢失。
用 $args 或 $query_string 显式拼接参数
要保留原始查询参数,需在 rewrite 目标中手动加上 $args(或 $query_string):
- rewrite ^/old/(.*)$ /new/$1?$args; → 保留原参数
- rewrite ^/old/(.*)$ /new/$1?$query_string; → 效果同上,语义更明确
注意结尾的 ?:有它才表示开始 query string;没它,$args 会被当作路径一部分。
使用 permanent 或 redirect 时同样适用
即使加了跳转标志,参数透传逻辑不变:
- rewrite ^/old/(.*)$ /new/$1?$args permanent;
- rewrite ^/old/(.*)$ /new/$1?$args redirect;
浏览器收到的 301/302 响应中,Location 头会包含完整的新 URL(含参数)。
避免重复添加参数的场景
如果目标路径本身已带固定参数(如 /new/$1?src=nginx),而你还想保留原始参数,可用 concat 方式组合:
- rewrite ^/old/(.*)$ /new/$1?src=nginx&$args;
- 注意用 & 连接(HTML 实体),Nginx 配置中直接写 & 会导致语法错误
- 若原始请求无参数,$args 为空,结果为 /new/x?src=nginx,不会多出 &
不复杂但容易忽略











