nginx rewrite默认自动保留原始查询参数,结尾加?可清空或覆盖,用$args可拼接,复杂逻辑推荐map预处理或return构造完整url。

Nginx 的 rewrite 默认会自动保留原始请求中的查询字符串(query string),但如果你需要主动拼接、覆盖或修改参数,就得明确控制 ? 的行为——关键在于结尾是否加 ? 或使用 $args。
默认行为:自动追加原查询参数
当 rewrite 目标 URL 不以 ? 结尾时,Nginx 会把原始 GET 参数自动拼在重写后的 URL 后面:
rewrite ^/old/(.*)$ /new/$1;
访问 /old/a?x=1&y=2 → 重写为 /new/a?x=1&y=2
覆盖或清空查询参数:结尾加 ?
在 rewrite 目标末尾显式加上 ?(不带任何内容),即可丢弃原始参数;若需自定义参数,则在 ? 后手动拼接:
rewrite ^/old/(.*)$ /new/$1?; # 清空所有原始参数rewrite ^/old/(.*)$ /new/$1?a=1&b=2; # 覆盖为固定参数rewrite ^/old/(.*)$ /new/$1?a=1&b=2&$args; # 保留原始参数并前置新增
动态拼接参数:用 $args + map 或 if(谨慎)
单纯靠 rewrite 难以做条件拼接(如“有 x 才加 y=3”),此时推荐配合 map 预处理变量,再在 rewrite 中引用:
在 http 块中定义:
示例:当原始请求含debug=1,则追加 &env=test
map $args $extra_args {<br>
~debug=1&(.*) &env=test;<br>
~debug=1$ &env=test;<br>
default "";<br>
}
然后 rewrite 中使用:rewrite ^/api/(.*)$ /v2/api/$1?$args$extra_args;
注意:if + rewrite 拼参易出错,尽量避免
if 在 location 中对 $args 做判断再 rewrite,可能因执行顺序和嵌套导致参数丢失或重复。更可靠的方式是:
- 优先用
map提前计算好目标参数字符串 - 需要复杂逻辑时,改用
return 302+ 完整 URL 构造(支持变量拼接) - 调试时加
add_header X-Rewritten-Args "$args";查看实际值











