处理带复杂查询字符串的临时跳转,核心是用 return 302 + $request_uri 完整保留路径和参数,目标 URL 必须带完整协议;需改写参数时用 rewrite redirect 或 map 预处理,变量引用须加双引号,验证需用 curl -I 检查响应头。

处理带复杂查询字符串的临时跳转,核心是完整保留原始请求中的路径和所有参数,同时确保跳转行为明确为临时性(302),不被缓存、不干扰 SEO。
用 return 302 + $request_uri 最稳妥
这是首选方式,语法简洁、执行高效、无歧义:
-
return 302 https://target.com$request_uri;——$request_uri自动包含完整的路径和查询字符串(如/search?q=nginx&sort=desc&utm_source=test) - 避免用
$uri?$args手动拼接,容易在$args为空时多出问号(如/path?),而$request_uri天然规避该问题 - 目标 URL 必须带完整协议(
https://),否则会变成站内相对跳转
需要过滤或改写参数时,用 rewrite + redirect
当不能原样透传所有参数(比如要剔除 debug=1、统一加 v=2),rewrite 更灵活:
- 示例:去掉特定参数并追加新参数
rewrite ^(.*)$ https://target.com$1?v=2&$(echo $args | sed 's/&debug=[^&]*//g' | sed 's/^&//') redirect;
(注:Nginx 原生不支持复杂字符串处理,实际中建议用 Lua 或后端处理;若必须 Nginx 内完成,可结合map预处理关键参数) - 只保留部分参数:用
map提取所需字段,再拼到return中,比在 if 里拼接更健壮
注意变量引用和特殊字符安全
如果目标地址中含变量(如 $arg_ref 或动态域名),必须用双引号包裹:
- ✅ 正确:
return 302 "https://$arg_domain.example.com$request_uri"; - ❌ 错误:
return 302 https://$arg_domain.example.com$request_uri;(遇到空值或空格会解析失败) - 含中文、+、% 等编码字符的参数,
$request_uri已自动编码,无需额外处理
验证是否真正生效
别只看浏览器跳转结果,用命令行确认原始响应头:
curl -I "http://example.com/path?a=1&b=2&c=测试"- 检查输出中是否含:
HTTP/1.1 302 FoundLocation: https://target.com/path?a=1&b=2&c=%E6%B5%8B%E8%AF%95 - 若出现 301、200 或 Location 地址缺失/错误,说明配置有误(常见于漏写协议、误用 rewrite flag 或 internal 限制)


















