核心是分离80端口跳转与443端口https服务:80端口server块用return 301 https://$host$request_uri;实现高效跳转,443端口server块独立启用ssl证书并确保正常响应。

直接在 Nginx 中配置 HTTP 到 HTTPS 的 301 永久跳转,核心是分离处理:80 端口只做跳转,443 端口专注提供安全服务。不合并、不混用,才能稳定生效。
监听 80 端口并返回标准 301 跳转
新建或修改一个独立的 server 块,仅绑定 HTTP 流量:
- 必须写
listen 80;,不能加ssl或证书指令,否则启动失败 -
server_name填你实际使用的域名(如example.com www.example.com),支持多域名 - 用
return 301 https://$host$request_uri;——$host保留原始域名,$request_uri完整携带路径和查询参数(比如?id=123&ref=abc) - 不要用
rewrite,它会改变请求方法(POST/DELETE 变 GET),导致 API 或表单失效
确保 443 端口 HTTPS 服务已就绪
这是跳转能生效的前提。该 server 块必须与上面的 80 块完全分开:
- 写
listen 443 ssl http2;(http2可选但推荐) - 指定有效证书:
ssl_certificate /path/to/fullchain.pem;和ssl_certificate_key /path/to/privkey.pem; - 证书路径要正确,且 Nginx 进程有读取私钥权限(通常
chmod 600 privkey.pem) - 建议加上 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;,让浏览器自动记住只走 HTTPS
验证与上线前检查
配置不是保存就完事,必须确认无误再启用:
- 运行
sudo nginx -t—— 返回 “syntax is okay” 和 “test is successful” 才算通过 - 执行
sudo systemctl reload nginx(或sudo nginx -s reload)使新配置生效 - 用
curl -I http://yourdomain.com查看响应头,状态码应为301 Moved Permanently,Location头指向正确的 HTTPS 地址 - 检查防火墙是否放行 443 端口(如
sudo ufw allow 443),否则跳过去也打不开
避免常见陷阱
很多跳转失败其实卡在细节上:
- CDN(如 Cloudflare)开启“强制 HTTPS”后,源站 Nginx 再配跳转会引发双重跳转,此时应关闭 CDN 的强制跳转,只靠 Nginx 控制
- 如果网站含 POST 表单或 API 接口,千万别用
rewrite ... permanent,它会把非 GET 请求转成 GET,破坏业务逻辑 - 本地测试时注意 hosts 文件或 DNS 缓存,浏览器可能记住了旧跳转规则,可换隐身窗口或清缓存再试
- 证书过期或链不全会导致 HTTPS 服务起不来,跳转后页面显示不安全警告——先确保
https://yourdomain.com本身能正常打开











