0

Nginx return跨域名重定向参数保留方案:3个实战配置让查询字符串完整传递

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 层面配置回源主机头为正确值

总结

跨域名重定向保留参数的核心原则:

  1. 优先用 ,它自带路径和参数,最省事
  2. 只跳首页或固定路径时,手动拼接
  3. 需要过滤参数时用 map 指令,不要在 if 里写复杂逻辑
  4. 发布前用 curl 验证,不要靠浏览器测,浏览器会缓存 301

掌握这几点,跨域名重定向的参数保留问题基本可以一网打尽。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论