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 https://new-example.com$request_uri;
}
  • 301:永久重定向,向搜索引擎声明永久迁移,但不保证全部排名/信号原样转移。
  • 显式 https:HTTP 入口也直接转到新域名的 HTTPS,避免额外明文跳转。
  • $request_uri:原始 URI(含查询参数),保证 /a?x=1 跳到新域后参数不丢。

return 指令由 rewrite 模块处理,放在 server 层时可在 location 查找前结束请求;location 内的 return 则已完成该 location 选择,不应无条件概括性能最好。

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 块千万别把旧域名也写进去。
  • 验证旧链接:选取带路径和查询参数的旧 URL,检查每一跳的状态码、Location 和最终响应;上线后比较旧域名与新域名的 404 记录。

常见问题(FAQ)

Q:301 和 302 对 SEO 有什么区别?
A:301/308 表示永久迁移,302/307 表示临时重定向;308/307 保留方法和请求体。搜索引擎处理仍取决于实际抓取和其他信号,不保证权重转移,永久迁移也并非只能用 301。

Q:rewrite 和 return 选哪个?
A:整条 URI 原样带过去用 return;需要按正则改写路径才用 rewrite。简单跳转用 return 更直观;实际性能不能脱离规则与请求场景保证。

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台