2026.05.31 | youres | 29次围观
问题背景
网站从 domain-a.com 迁移到 domain-b.com,或者做多域名合并时,用 return 301 做跨域名重定向,但发现用户访问 domain-a.com/search?q=nginx 跳转到 domain-b.com/search 后,?q=nginx 没了。
这不是 Nginx 的 bug,而是 return 指令的行为特性:当你在 return 的目标 URL 里写了完整路径但没有显式拼接参数时,原始查询字符串不会自动附加。
方案一:拼接 (推荐)
最稳妥的写法,适用于所有场景:
server {
server_name domain-a.com;
return 301 https://domain-b.com;
}
自带完整的路径和查询参数,所以跨域名跳转时参数天然保留,这是最省事的写法。
如果你只拼路径不带参数,就需要手动加:
server {
server_name domain-a.com;
# 只重定向到首页并保留所有参数
return 301 https://domain-b.com/;
}
方案二:多域名映射保留原参数
有多个旧域名要跳转到新域名,且需要保留各自的查询参数:
server {
server_name old-domain1.com old-domain2.com;
return 301 https://www.newdomain.com;
}
# 或者只保留特定参数
map {
"~(utm_source=[^&]*)&(utm_medium=[^&]*)" "?&";
"~(utm_source=[^&]*)" "?";
default "";
}
server {
server_name old-domain.com;
return 301 https://newdomain.com/;
}
用 map 指令可以按需过滤参数,比如只保留 UTM 相关参数,去掉无意义的追踪参数。
方案三:条件判断按需保留参数
只在某些条件下保留参数,比如只对搜索页保留,其他页面做纯域名跳转:
server {
server_name old-domain.com;
# 搜索页保留参数
if ( ~ ^/search) {
return 301 https://newdomain.com;
}
# 其他页面不保留参数,直接跳首页
return 301 https://newdomain.com/;
}
注意:if 在 Nginx 里有陷阱,上面的写法在 server 块里是安全的。如果在 location 块里用,建议改用 map + 变量方式。
跨域名跳转的完整推荐配置
综合来看,最简洁且不出错的跨域名跳转写法是:
server {
listen 443 ssl;
server_name old-domain.com;
# 301 跳转到新域名,完整保留路径和参数
return 301 https://newdomain.com;
}
# HTTP 也一并跳转
server {
listen 80;
server_name old-domain.com;
return 301 https://newdomain.com;
}
验证方法
用 curl 验证跨域名跳转是否保留了参数:
# -L 跟随重定向,-v 显示详细信息
curl -L -v "https://old-domain.com/search?q=nginx&page=2" 2>&1 | grep -i "location"
# 更直观:只看最终状态码和跳转地址
curl -s -o /dev/null -w "%{http_code} %{redirect_url}" "https://old-domain.com/search?q=test"
Windows PowerShell 用户可以用:
= Invoke-WebRequest -Uri "https://old-domain.com/search?q=nginx" -MaximumRedirection 0 -ErrorAction SilentlyContinue
.Headers.Location
常见坑
- 坑一:用
return 301 https://newdomain.com/;结尾带了/又没拼,所有参数丢失 → 去掉/或改成 - 坑二:新旧域名都是 HTTPS,但旧域名证书已过期,浏览器直接拦截,用户看不到跳转 → 证书过期前就要完成迁移并续期
- 坑三:CDN(如 Cloudflare)在前面做了强制 HTTPS 跳转,Nginx 收到的已经是 HTTPS 请求,但 Host 头还是旧域名,导致跳转循环 → 在 CDN 层面配置回源主机头为正确值
总结
跨域名重定向保留参数的核心原则:
- 优先用
,它自带路径和参数,最省事 - 只跳首页或固定路径时,手动拼接
- 需要过滤参数时用
map指令,不要在if里写复杂逻辑 - 发布前用 curl 验证,不要靠浏览器测,浏览器会缓存 301
掌握这几点,跨域名重定向的参数保留问题基本可以一网打尽。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论