Nginx 全站 HTTPS 升级需用独立 HTTP server 块 return 301 跳转,HTTPS server 块单独监听 443 ssl,配置证书与 HSTS,并严格验证后 reload;常见陷阱包括防火墙未开 443、私钥权限错误、误用 rewrite 或 CDN 双重跳转。

全站升级 HTTPS 时,Nginx 的 301 重定向必须精准、安全、无循环,核心是让所有 HTTP 请求一次性跳转到对应 HTTPS 地址,同时不干扰正常 HTTPS 服务。
只用 return 指令配 HTTP server 块
在独立的 listen 80 server 块中,直接使用 return 301,这是最简洁可靠的方式:
- 写法示例:
return 301 https://$host$request_uri; -
$host保留原始域名(支持多域名共用同一配置) -
$request_uri完整保留路径和查询参数(如/search?q=nginx) - 绝对不要在这个块里加
ssl on或证书指令,否则会报错
HTTPS server 块必须单独存在且可用
另一个 server 块监听 443 ssl,专用于响应 HTTPS 请求:
- 必须包含
listen 443 ssl http2;(http2 可选但推荐) - 证书路径要准确:
ssl_certificate和ssl_certificate_key - 建议加上 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 这个块不能和 HTTP 块合并,否则重定向逻辑失效
务必验证并重载,别跳过检查
配置改完不是直接 reload 就完事,漏掉验证极易导致服务中断:
- 先运行
nginx -t:确认语法无误、证书路径可读、端口未被占用 - 再执行
nginx -s reload或systemctl reload nginx - 测试时用 curl 验证状态码:
curl -I http://yourdomain.com应返回301 Moved Permanently和Location: https://... - 浏览器访问 HTTP 地址,地址栏应立刻变为 HTTPS,且锁图标显示正常
注意常见陷阱
很多问题其实就卡在这几个细节上:
- 防火墙没开 443 端口 → HTTPS 请求根本连不上,跳转后白屏
- 证书私钥权限不对(比如 root 可读但 nginx 用户不可读)→
nginx -t报错或 reload 后 HTTPS 不响应 - 用了
rewrite替代return→ 容易因变量解析出错或触发多跳,尤其在有 CDN 时更易混乱 - CDN 开启“强制 HTTPS”又源站也做跳转 → 双重 301,可能被浏览器拦截或影响首屏速度


















