最简洁高效的http强制跳转https方案是配置专用http server块,仅含listen 80、server_name及return 301 https://$host$request_uri;,并确保https server已正确启用ssl与hsts。

直接在 Nginx 中监听 80 端口,用 return 301 指令跳转到 HTTPS 地址,是最简洁、高效且符合生产标准的做法。它不经过 rewrite 引擎,不触发 location 匹配,性能高、逻辑清晰、SEO 友好。
配置一个专用的 HTTP server 块
这个 server 块只做一件事:接收所有 HTTP 请求,立刻返回 301 响应。不要在里面写 root、index 或 location。
- 必须包含
listen 80;,明确绑定 HTTP 流量 -
server_name要与你的 HTTPS 站点一致(如example.com www.example.com) - 跳转语句推荐写成:
return 301 https://$host$request_uri; -
$host来自请求头,能准确反映用户访问的域名(含子域),比$server_name更实用;$request_uri完整保留路径和查询参数(如/blog?id=123)
确保 HTTPS server 已就绪
跳过去要是打不开,重定向就失去意义。443 端口的 server 块必须满足基本安全要求:
- 有
listen 443 ssl http2;(启用 HTTP/2 提升体验) -
ssl_certificate和ssl_certificate_key指向有效的证书文件(如 Let’s Encrypt 的 fullchain.pem 和 privkey.pem) - 建议加上
ssl_protocols TLSv1.2 TLSv1.3;和add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;(HSTS 头)
避开常见陷阱
很多“配置完了却不跳”的问题,其实出在细节上:
- 改完配置后必须执行
nginx -t检查语法,再nginx -s reload(宝塔面板需点「重载配置」,不是「重启」) - 浏览器会强缓存 301,本地测试务必用无痕窗口,或用
curl -I http://your-site.com/test查看响应头中的Location和状态码 - 避免重复跳转:如果用了宝塔「强制 HTTPS」开关,就不要再手动加
return 301,否则可能引发双跳 - 页面里硬写的
http://资源(图片、JS、CSS)会导致混合内容报错,这不是 Nginx 能解决的,需前端统一改为相对协议或 HTTPS 地址
需要例外路径?用 if 判断即可
比如 /api、/health 等接口不想跳 HTTPS,可在 80 端口 server 块中这样写:
if ($request_uri !~ ^/api/) { return 301 https://$host$request_uri; }- 排除多个路径:用
&&连接,如!~ ^/api/ && !~ ^/static/ - 注意正则结尾斜杠——
^/api/不匹配/apiv2,但会匹配/api/v1











