必须配置两个独立的Nginx server块:一是80端口将http://example.com和http://www.example.com均301跳转至https://www.example.com;二是443端口专用于https://example.com跳转至https://www.example.com,且两块均需支持覆盖双域名的SSL证书。

要让 http://example.com、http://www.example.com、https://example.com 全部统一跳转到 https://www.example.com,关键在于两件事:一是所有 HTTP 请求必须强制走 HTTPS,二是所有非 www 的 HTTPS 请求也要跳转到带 www 的 HTTPS 地址。这需要两个独立的 server 块配合 SSL 证书支持,且证书必须覆盖 example.com 和 www.example.com(推荐使用通配符 *.example.com 或多域名证书)。
HTTP 全量重定向到 HTTPS www
这是最基础也是最关键的一步。用一个监听 80 端口的 server 块,把所有进来的 HTTP 请求(无论带不带 www)都 301 跳转到 https://www.example.com:
- 配置中
server_name同时写上两个域名,避免漏匹配 - 使用
return 301比rewrite更高效、更安全 -
$request_uri保留原始路径和参数,保证跳转不丢信息
示例:
server {listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
HTTPS 非 www 到 www 的精准跳转
仅靠上一步还不够——用户如果直接访问 https://example.com,会绕过 80 端口,直接进入 443 块。这时必须单独为 example.com(不带 www)配置一个 HTTPS server 块,只做跳转,不提供服务:
- 这个块必须监听 443,
server_name example.com - 它需要自己的 SSL 证书(或与主站共用通配符证书);否则浏览器会报“您的连接不是私密连接”
- 同样用
return 301跳转,目标是https://www.example.com$request_uri
示例:
server {listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
return 301 https://www.example.com$request_uri;
}
主站 HTTPS 配置(带 www)
最后一个 server 块负责真正提供内容,监听 443,绑定 www.example.com,加载完整 SSL 配置和网站逻辑:
- 确保该块中
server_name明确指定为www.example.com - SSL 证书路径需与前一跳转块一致(如果是通配符证书,可复用)
- 这里可以放
root、location、反向代理等实际业务配置
示例:
server {listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
# 其他网站配置...
location / {
proxy_pass http://backend;
}
}
验证与注意事项
配置完成后别忘了测试和重载:
- 运行
nginx -t检查语法是否正确 - 执行
sudo nginx -s reload生效新配置 - 用 curl 测试:
curl -I http://example.com、curl -I https://example.com,确认状态码都是 301,Location 头指向https://www.example.com/... - 证书必须同时覆盖
example.com和www.example.com,单域名证书会导致跳转块在 HTTPS 下失效


















