Nginx 如何做 www 与非 www(no-www)域名互跳?
Nginx www 与裸域互跳配置:独立 server 块 + return 301,$request_uri 保留路径;HTTP/HTTPS 双端口完整示例、选哪个做规范域的 SEO 建议与 FAQ。
给要跳走的那一变体单独写一个 server 块,return 301 到规范域名,路径用 $request_uri 原样保留。 www 跳裸域还是裸域跳 www 没有对错,选一个做规范域名、全站统一即可。
www → 裸域
server {
listen 80;
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt; # 本块证书需覆盖 www.example.com
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
root /var/www/example;
index index.html;
}
裸域 → www(反向同理)
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 301 https://www.example.com$request_uri;
}
反向方案同样需要为规范域名 www.example.com 配置 HTTP→HTTPS 跳转和 HTTPS 内容块;不要把正反两组同时启用。
关键点提醒
- HTTPS 一侧也要配置跳转:很多人只配了 80 端口的跳转,结果用户直接访问
https://www.example.com看到的是另一个站点(或证书错误)。两个变体、两个端口 = 四处入口都要照顾到。 - 证书要覆盖两个名字:每个 HTTPS 入口都需有效证书覆盖所服务的名字,可以共用一张包含两个 SAN 的证书,也可分别使用两张;重定向前先进行 TLS 握手。Let's Encrypt 申请时
certbot -d example.com -d www.example.com。 - 301 会被浏览器和搜索引擎缓存:上线前用 302 验证行为,确认无误再换 301。
$request_uri别丢:漏了它所有内页都跳回首页。
上线后应分别验证两个域名的首跳响应和最终页面。使用观测云 HTTP 拨测时,可以关闭跟随重定向,检查首跳状态码和响应头,再用另一个任务跟随跳转确认最终页面;这样才能区分“跳转规则生效”和“最终页面可访问”。
SEO 角度怎么选
- 搜索引擎把 www 和裸域视为两个不同站点——不统一会分散权重并产生重复内容。
- 选哪个纯属偏好(裸域更简短;www 更便于普通 CNAME 配置;cookie 隔离取决于 host-only/Domain 等属性,不是仅加 www 就自动隔离)。
- 选一个,全部 301 过去,并统一 canonical、站点地图及内部链接;Google Search Console 已无旧版首选域名设置,别再反复横跳。
常见问题(FAQ)
Q:能用 rewrite 代替 return 301 吗?
A:能,但没必要。return 开销更小、意图更清晰;只有需要复杂正则改写时才用 rewrite。
Q:跳转循环了(浏览器报重定向次数过多)?
A:检查 443 的规范 server 块是否也写了跳转规则——常见错误是把 return 301 从 80 块复制到了 443 块。规范域名的 server 块里不该再有指向自己的跳转。
Q:CDN 后面的跳转要注意什么?
A:CDN 可能缓存了跳转响应,改规则后要刷新缓存;同时确认 CDN 回源 Host 头配置,避免源站收到的 Host 已经不是原始域名导致跳转逻辑错乱。