Nginx 如何重定向到不同的域名?

Nginx 跨域重定向的两种写法:return 301 永久跳转与 rewrite 正则保留路径,含 HTTPS 场景、正则捕获分组、常见坑(斜杠、query string)与 FAQ。

最佳实践
Nginx 如何重定向到不同的域名?封面

在 server 块里用 return 301 https://新域名$request_uri; 即可——$request_uri 会把原始路径和查询串完整带过去。 永久跳转用 301,临时跳转用 302;需要更细粒度的路径改写再用 rewrite

1. 最简单的整站跳转(推荐)

server {
    listen 80;
    server_name old-example.com;

    return 301 $scheme://new-example.com$request_uri;
}
  • 301:永久重定向,搜索引擎会把权重迁移到新域名(SEO 换域必用)。
  • $scheme:沿用原始请求的协议(http/https)。
  • $request_uri:原始 URI(含查询参数),保证 /a?x=1 跳到新域后参数不丢。

return 指令由 rewrite 模块处理,不经过 location 匹配,性能最好,官方也推荐优先于 rewrite

2. 用 rewrite 做规则化跳转

当新旧域名路径结构不同、需要正则改写时:

server {
    listen 80;
    server_name old-example.com;

    rewrite ^/blog/(.*)$ https://new-example.com/articles/$1 permanent;
    return 301 https://new-example.com$request_uri;  # 兜底
}
  • permanent 等价于 301;redirect 等价于 302。
  • rewrite 默认会带上原查询串;若不想带,在目标结尾加 ?(如 .../$1?)。

3. HTTPS 站点的完整写法

server {
    listen 443 ssl;
    server_name old-example.com;
    ssl_certificate     /etc/nginx/ssl/old-example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/old-example.com.key;

    return 301 https://new-example.com$request_uri;
}

旧域名的证书必须仍然有效——TLS 握手发生在重定向之前,证书过期用户会先看到浏览器警告。

4. 常见坑

  • 少写 $request_uri:所有路径都跳到新站首页,内链全废。
  • 多域名跳转server_name 可列多个(old.com www.old.com;),一条规则全收。
  • 跳转循环:新域名的 server 块千万别把旧域名也写进去。

观测云对照

域名迁移期间最怕"老链接 404/跳转链过长"却无人知晓。把 Nginx 访问日志接入观测云,在日志查看器里统计 301/302/404 的状态码分布与来源 referer;用监控器对 404 突增设告警,跳转规则写错十分钟内就能发现。

常见问题(FAQ)

Q:301 和 302 对 SEO 有什么区别?
A:301 表示永久迁移,搜索引擎会把收录和权重转移到新地址;302 是临时跳转,搜索引擎继续保留原地址。换域名一定要用 301。

Q:rewrite 和 return 选哪个?
A:整条 URI 原样带过去用 return;需要按正则改写路径才用 rewritereturn 更直观也更快。

Q:跳转后浏览器地址栏没变?
A:你写的可能是 proxy_pass(反向代理)而不是 return/rewrite——代理不改地址栏,重定向才会。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台