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 $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;需要按正则改写路径才用 rewrite。return 更直观也更快。
Q:跳转后浏览器地址栏没变?
A:你写的可能是 proxy_pass(反向代理)而不是 return/rewrite——代理不改地址栏,重定向才会。