最稳妥方案是用两个独立server块分别处理HTTP和HTTPS裸域名跳转:80端口监听example.com与www.example.com并301跳转至https://www.example.com$request_uri;443端口单独监听example.com,配置对应SSL证书后同样301跳转;主站server块仅绑定www.example.com提供实际服务。
直接用 return 301 配独立 server 块最稳妥,不依赖正则、不走 if、性能高且对 SEO 友好。
所有 HTTP 流量(无论 example.com 还是 www.example.com)都应强制升级到 HTTPS 并带上 www。只需一个监听 80 端口的 server 块:
server_name 同时写两个域名,确保全覆盖return 301 https://www.example.com$request_uri; 跳转,保留路径和参数rewrite 或 if,Nginx 最新明确指出它们低效且易出错示例配置:
server {listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}
用户如果直接访问 https://example.com,会绕过 80 端口,必须单独配一个监听 443 的跳转块:
server_name example.com,只匹配裸域名example.com 的 SSL 证书(通配符 *.example.com 或 SAN 多域名证书均可)return 301 https://www.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;
return 301 https://www.example.com$request_uri;
}
真正提供网页内容的 server 块,应严格限定为 www.example.com:
server_name www.example.com,不包含裸域名这样三块分离:HTTP 全量跳转 → HTTPS 裸域名跳转 → HTTPS 主站服务,职责清晰、无冲突、易维护。