必须用三个独立nginx server块协同工作:80端口块统一301跳转所有http请求至https://www.example.com;443端口跳转块专处理https://example.com并301跳转;443端口主站块仅响应https://www.example.com,且ssl证书须同时覆盖example.com和www.example.com。

要让 Nginx 同时支持 带 www 和 不带 www 的 HTTPS 访问,并统一跳转到你指定的规范形式(比如强制走 https://www.example.com),关键不是“同时支持”,而是**精准分流 + 分块处理**:HTTP 全量进 HTTPS、HTTPS 下非规范域名再跳转、主站只响应规范域名。
必须用三个独立 server 块协同工作
不能靠一个块搞定所有情况。浏览器访问 http://example.com、http://www.example.com、https://example.com 会命中不同监听逻辑,必须分别覆盖:
-
80 端口块:捕获所有 HTTP 请求(无论带不带 www),统一 301 跳转到
https://www.example.com$request_uri -
443 端口跳转块:仅监听
example.com(不带 www),证书需覆盖该域名,return 301 到https://www.example.com$request_uri -
443 端口主站块:仅监听
www.example.com,加载完整 SSL 配置和网站内容(root、location、proxy_pass 等)
SSL 证书必须覆盖双域名
如果 https://example.com 的请求直接打到 443 端口但证书不包含 example.com,浏览器会报“连接不安全”,跳转根本不会执行。解决方案只有两个:
- 使用通配符证书(
*.example.com),它天然支持www.example.com和example.com - 或多域名(SAN)证书,显式列出
example.com和www.example.com
自签名或仅含 www.example.com 的单域名证书会导致跳转块失效。
配置示例(以 example.com 为例)
以下三段必须全部写入 nginx.conf 或对应 include 文件中,顺序无关,但不能合并:
-
# HTTP 全量跳转(80 端口)
server {<br> listen 80;<br> server_name example.com www.example.com;<br> return 301 https://www.example.com$request_uri;<br>} -
# HTTPS 非 www 跳转(443 端口)
server {<br> listen 443 ssl;<br> server_name example.com;<br> ssl_certificate /path/to/cert.pem;<br> ssl_certificate_key /path/to/key.pem;<br> return 301 https://www.example.com$request_uri;<br>} -
# HTTPS 主站服务(443 端口)
server {<br> listen 443 ssl;<br> server_name www.example.com;<br> ssl_certificate /path/to/cert.pem;<br> ssl_certificate_key /path/to/key.pem;<br> # 此处放 root、location、反向代理等实际配置<br>}
验证是否生效的简单方法
改完配置后 reload nginx,然后在终端逐个测试:
-
curl -I http://example.com→ 应返回301,Location 头为https://www.example.com/ -
curl -I http://www.example.com→ 同样返回301指向https://www.example.com/ -
curl -I https://example.com→ 返回301,且无证书警告(说明证书有效) -
curl -I https://www.example.com→ 返回200,且有正确响应头和内容











