Nginx重定向“无感”的关键是显式保留查询参数,必须用$args拼接到新URI中;return 301 /new?$args;或rewrite ^/old(.*)$ /new$1?$args permanent;,proxy_pass末尾加/确保参数透传。

要让 Nginx 重定向“无感”,核心是确保用户发起的请求里所有查询参数(比如 bayy、id、utm_source 等)原封不动地出现在跳转后的新地址中。这不是默认行为,必须显式配置,否则常见于 rewrite 或 return 场景下参数被清空。
用 $args 显式拼接参数
这是最直接、最可靠的方式,尤其适合简单跳转。Nginx 的内置变量 $args 就代表原始 URL 中完整的查询字符串(不含 ?),直接在重定向目标中引用即可。
- 使用 return 指令(推荐用于 301/302):
return 301 /new-path?$args; - 使用 rewrite 指令(需加 permanent 或 redirect):
rewrite ^/old-path(.*)$ /new-path$1?$args permanent;
注意:正则中的 (.*) 匹配路径尾部,$1 还原路径,$args 补全参数。
避免 rewrite 中隐式丢参的陷阱
rewrite 默认只处理 URI 路径部分,不自动携带参数。若写成 rewrite ^/old /new permanent;,后面所有参数都会消失。
- 务必检查 rewrite 规则末尾是否显式包含 $args 或 $query_string(二者等价)
- 如果规则中用了 break 或 last,那是内部重定向,参数不会丢失;但加了 permanent/redirect 就是外部跳转,必须手动传参
- 不要依赖“看起来没动参数”就认为安全——只要用了重定向状态码,就必须确认 $args 出现在目标 URI 中
针对特定参数做条件保留
当只需保留某个关键参数(如 bayy),而其他参数可选或需过滤时,可用 if + set 提前捕获:
- 先匹配并提取:
if ($args ~* "(^|&)bayy=([^&]*)&?") { set $saved_bayy $2; } - 再构造跳转:
return 301 /new-path?bayy=$saved_bayy; - 这样即使原始请求带了几十个参数,最终也只透传 bayy,干净可控
反向代理场景下的参数延续
如果是 proxy_pass 带来的“类重定向”错觉(比如访问 /api 后端却收不到参数),问题常出在 proxy_pass 末尾是否带斜杠:
- ❌
proxy_pass https://backend;→ 会丢弃原始 URI 和参数 - ✅
proxy_pass https://backend/;→ 自动拼接原始路径与参数,完整透传 - 额外建议:加上
proxy_set_header X-Original-Args $args;,便于后端调试溯源


















