Nginx 如何重定向到不同的域名?
Nginx 跨域重定向的两种写法:return 301 永久跳转与 rewrite 正则保留路径,含 HTTPS 场景、正则捕获分组、常见坑(斜杠、query string)与 FAQ。
在 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——代理不改地址栏,重定向才会。