Nginx需配置两个server块:80端口用return 301强制跳转至HTTPS,443端口启用SSL提供服务;HTTP块禁用ssl/proxy_pass/root,HTTPS块配置证书、TLS协议及多域名支持,避免循环重定向。

要让 Nginx 同时监听 80(HTTP)和 443(HTTPS)端口,并将所有 HTTP 请求统一重定向到 HTTPS,关键在于配置两个 server 块:一个处理 80 端口的强制跳转,另一个处理 443 端口的 HTTPS 服务。重点是避免循环重定向、证书配置正确、且重定向使用 return 301(而非 rewrite),确保语义清晰、性能高效。
配置 HTTP server 块:强制 301 跳转到 HTTPS
这个 server 块只监听 80 端口,不做任何业务处理,纯粹用于重定向。务必使用 return 301,它比 rewrite 更快、更安全,且不会触发内部 URI 重写逻辑。
- 监听 80 端口,server_name 应与 HTTPS 的保持一致(如 example.com 或泛域名)
- 使用 return 301 https://$host$request_uri; —— $host 保留原始域名(支持多域名),$request_uri 保留完整路径和查询参数
- 不要在该块中启用 ssl、proxy_pass 或 root,否则可能引发冲突或意外行为
配置 HTTPS server 块:启用 SSL 并提供服务
这个 server 块监听 443 端口,需启用 SSL 并加载有效证书。它是实际处理请求的地方,所有业务逻辑(如反向代理、静态文件服务)都放在这里。
- 必须包含 listen 443 ssl http2;(http2 可选但推荐)
- 指定证书路径:ssl_certificate /path/to/fullchain.pem; 和 ssl_certificate_key /path/to/privkey.pem;
- 建议启用基础安全配置,如 ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers off;
- server_name 与 HTTP 块一致,确保 Host 匹配,避免 SNI 问题
注意多个域名或泛域名场景
如果站点支持多个域名(如 www.example.com 和 example.com),HTTP server 块中的 return 语句会自动适配 $host,无需为每个域名单独写规则。HTTPS server 块中,server_name 可写多个,用空格分隔:server_name example.com www.example.com;。证书也需覆盖所有域名(如通过 SAN 或通配符证书)。
验证与调试要点
配置完成后 reload Nginx(nginx -s reload),再检查是否生效:
- 访问 http://example.com → 应 301 跳转到 https://example.com,状态码为 301,Location 头正确
- curl -I http://example.com 应返回 Location: https://example.com/
- 确保防火墙开放 443 端口,且证书链完整(可使用 openssl s_client -connect example.com:443 -servername example.com 测试)
- 避免在 HTTPS server 中误写 return 301 https://...,否则会导致自身跳转,形成死循环


















