最推荐用 return 301 直接跳转:http 全部一步跳至 https://example.com;https 中 www 也跳至裸域名,避免双重跳转;需正则匹配 server_name 并保留 $request_uri,重载后用 curl 验证 301 响应。

用 return 301 指令直接跳转最简洁高效,避免 rewrite 的额外匹配开销,也更利于 SEO 权重集中。
HTTP 流量统一跳转到不带 www 的 HTTPS 根域名
这是最常见且推荐的做法:所有 HTTP 请求(无论带不带 www)都一步跳转到 https://example.com,不经过中间跳转。
- 在监听 80 端口的 server 块中,用正则捕获根域名,自动丢弃 www 前缀
- server_name 写成
~^(?:www\.)?(.+)$,$1 就是去掉 www 后的主域名 - return 指令固定写为
https://$1$request_uri,确保协议升级且路径参数完整保留
示例配置:
server {listen 80;
server_name ~^(?:www\.)?(.+)$;
return 301 https://$1$request_uri;
}
HTTPS 流量中处理 www 到根域名的跳转
当用户已访问 https://www.example.com 时,需在 443 端口 server 块中拦截并跳转,防止双重跳转(如 http → https://www → https://example.com)。
- server_name 使用正则
~^www\.(.+)$或~^(?<www>www\.)?(.+)$</www>匹配带 www 的 HTTPS 请求 - if 判断 $www 是否存在,存在则 return 到
https://$2$request_uri($2 是捕获的主域名) - 注意:if 在 server 块中可用,但不能嵌套;变量名需用 ?
显式命名才可在 if 中引用
示例配置:
server {listen 443 ssl;
server_name ~^(?
if ($www) {
return 301 https://$2$request_uri;
}
# 其他 SSL 和站点配置...
}
只针对 www 子域名做跳转(简单场景)
如果旧配置已明确区分域名,且只希望 www.example.com 跳转,而 example.com 正常服务,可单独建一个 server 块。
- server_name 设为
www.example.com - return 301 直接指向
https://example.com$request_uri - 注意:此方式需确保 example.com 有另一个独立的 server 块处理正常请求
示例配置:
server {listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
验证与注意事项
配置完成后必须重载 Nginx(nginx -s reload),并用 curl 检查响应头是否返回 301 Moved Permanently 及正确 Location。
- 测试命令:
curl -I http://www.example.com/abc和curl -I https://www.example.com/abc - 确保 DNS 已将 www 和裸域名都解析到同一台服务器 IP
- 避免在第一个 server 块中无条件 return,否则 IP 直接访问也会被跳转,可能影响监控或调试
- 若使用 Let’s Encrypt,acme-challenge 路径需保留在对应 server 块中,不可被 return 覆盖











