0

Nginx return跨域名重定向参数保留方案:3个实战配置让UTM追踪不再中断

2026.06.21 | youres | 3次围观

在做域名合并、品牌升级或者营销Campaign落地时,经常需要把一个域名的流量跨域名重定向到另一个域名。如果这时候UTM参数、分页参数、搜索参数丢了,流量归因就会直接失效,SEO权重也会白白浪费。Nginx的return指令是最高效的重定向方式,但很多人写完后发现参数没有跟过去。这篇文章给出3个可以直接复制到生产环境的Nginx return跨域名重定向参数保留方案,帮你把查询字符串安全地传递到新域名。

一、为什么跨域名重定向比同域名更容易丢参数?

同域名下的301/302跳转,只要用$request_uri基本不会出错。但跨域名重定向时,目标URL的scheme、host都要手动拼接,一旦漏了变量或者多写了问号,参数就会消失。

常见丢参数场景:

  • 直接写死目标URL,比如 return 301 https://new.com/old-path;,原参数被全部丢弃。
  • $uri代替路径,但忘了拼$is_args$args
  • 目标URL结尾已经带了固定参数,再拼原参数时出现双问号。
  • 编码不一致导致加号、空格、中文参数被截断。

所以核心思路是:把目标host写死,但路径和查询参数交给Nginx变量来动态拼接。

二、方案一:用 $request_uri 完整保留路径和参数(推荐)

$request_uri是Nginx内置变量,包含原始请求的完整路径和查询字符串,且不会被用户再次编码。这是最简单的Nginx return跨域名重定向参数保留方案。

server {
    listen 80;
    server_name old.com www.old.com;
    location / {
        return 301 https://new.com$request_uri;
    }
}

效果:访问 http://old.com/product?utm_source=wechat&utm_campaign=summer 会被重定向到 https://new.com/product?utm_source=wechat&utm_campaign=summer,参数完全保留。

适用场景:整站迁移、老域名统一跳转新域名、HTTP跳转HTTPS且域名也变更。

注意事项:如果目标域名本身需要额外固定参数,比如?from=old,就不适合直接用这个方案,否则会出现双问号。下面两个方案解决这种情况。

三、方案二:用 $uri$is_args$args 精确控制拼接

有些场景你只需要保留原路径,同时附加目标域名的固定参数。这时用$uri$is_args$args拆分拼接更灵活。

server {
    listen 80;
    server_name old.com;
    location / {
        return 301 https://new.com$uri$is_args$args;
    }
}

变量含义:

  • $uri:当前请求解码后的路径,不含查询参数。
  • $is_args:如果有查询参数,值为?,否则为空。
  • $args:完整的查询参数字符串。

这个方案和方案一在效果上几乎一样,但你可以把目标URL扩展为更复杂的形式,例如:

return 301 https://new.com$uri$is_args$args&from_domain=old;

不过这里要注意:如果原始请求没有参数,$is_args为空,结果会变成https://new.com/path&from_domain=old,这是非法URL。需要改成if判断或者使用map指令来处理,不建议直接在生产环境写死拼接。

四、方案三:带条件判断的跨域名参数保留

如果老域名下只有部分路径需要跳转,或者只想保留特定参数,可以用if配合map,实现更精细的Nginx return跨域名重定向参数保留方案。

server {
    listen 80;
    server_name old.com;
    location / {
        if ($args ~* "utm_") {
            return 301 https://new.com$request_uri;
        }
        return 301 https://new.com$uri;
    }
}

这段配置的意思是:如果查询参数里包含utm_前缀,就保留全部参数跳转到新域名;否则只跳转路径,不带参数。这在清理无效跟踪参数、减少URL长度时很有用。

更稳妥的做法是用map集中管理参数,例如只保留utm_source、utm_medium、utm_campaign:

map $args $clean_args {
    default "";
    ~^(?.*utm_source=[^&]+(?:&utm_medium=[^&]+)?(?:&utm_campaign=[^&]+)?.*)$ $u;
}
server {
    listen 80;
    server_name old.com;
    location / {
        return 301 https://new.com$uri$is_args$clean_args;
    }
}

map方案比if更易维护,尤其适合参数规则复杂、需要多处复用的场景。

五、3个容易踩的坑

1. 双问号

如果你在目标URL里已经写了?,同时又用$request_uri$args,就会出现https://new.com/?from=old?utm_source=...这种错误URL。解决办法:不要写死?,用$is_args判断。

2. 参数编码

Nginx变量在拼接到Location头时,会按原始字节传递。如果目标域名前端有CDN或WAF,再次编码可能导致中文、空格、特殊字符被改。建议用curl验证最终Location URL。

3. 301 vs 302 的SEO影响

跨域名永久迁移用301,临时活动用302或307。301会把权重传递到新域名,但浏览器会长期缓存;临时测试一定要用302,否则改回来后客户端还跳。

六、验证方法

配置完后不要只看浏览器地址栏,用curl确认Location头:

curl -I -L "http://old.com/product?utm_source=wechat&utm_medium=social"

重点观察第一跳的Location:行,确认:

  • scheme和host已经变成新域名。
  • 路径和参数完整保留。
  • 没有双问号或&这类HTML实体。

如果用了多个重定向链,还要加--max-redirs限制,防止循环。

七、总结

Nginx return跨域名重定向参数保留方案的核心就是:目标域名写死,路径和参数用变量动态拼接。最简单的是return 301 https://new.com$request_uri;;需要精细控制时用$uri$is_args$args;需要过滤参数时用map或if判断。发布前务必用curl验证Location头,避免参数丢失影响流量归因。

更多相关实战:

版权声明

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

发表评论