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 和裸域
ssl_certificate_key /etc/nginx/ssl/example.com.key;
return 301 https://example.com$request_uri;
}
server {
listen 80;
listen 443 ssl;
server_name example.com;
...
}
裸域 → 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;
}
关键点提醒
- HTTPS 一侧也要配置跳转:很多人只配了 80 端口的跳转,结果用户直接访问
https://www.example.com看到的是另一个站点(或证书错误)。两个变体、两个端口 = 四处入口都要照顾到。 - 证书要覆盖两个名字:证书 SAN 里同时含
example.com和www.example.com,否则 https 跳转前就先报证书错。Let's Encrypt 申请时certbot -d example.com -d www.example.com。 - 301 会被浏览器和搜索引擎缓存:上线前用 302 验证行为,确认无误再换 301。
$request_uri别丢:漏了它所有内页都跳回首页。
SEO 角度怎么选
- 搜索引擎把 www 和裸域视为两个不同站点——不统一会分散权重并产生重复内容。
- 选哪个纯属偏好(裸域更简短;www 在 cookie 作用域和大 DNS 服务商 CNAME 支持上略有优势)。
- 选一个,全部 301 过去,并在搜索资源平台里声明规范域名,别再反复横跳。
观测云对照
域名跳转配错的表现很隐蔽:一部分老链接进了错误变体,流量悄悄流失。把 Nginx 访问日志接入观测云,按 host 分组看流量分布——规范域名之外的 host 应该只剩 301 跳转流量;若 www 变体上还有大量 200,说明跳转规则没全覆盖。状态码与跳转目标异常都可以配告警。
常见问题(FAQ)
Q:能用 rewrite 代替 return 301 吗?
A:能,但没必要。return 开销更小、意图更清晰;只有需要复杂正则改写时才用 rewrite。
Q:跳转循环了(浏览器报重定向次数过多)?
A:检查 443 的规范 server 块是否也写了跳转规则——常见错误是把 return 301 从 80 块复制到了 443 块。规范域名的 server 块里不该再有指向自己的跳转。
Q:CDN 后面的跳转要注意什么?
A:CDN 可能缓存了跳转响应,改规则后要刷新缓存;同时确认 CDN 回源 Host 头配置,避免源站收到的 Host 已经不是原始域名导致跳转逻辑错乱。