必须同时配置443端口HTTPS服务和80端口301跳转:443块启用ssl、正确设置证书路径及proxy_set_header X-Forwarded-Proto $scheme;80块用return 301 https://$host$request_uri实现完整路径跳转。

要让网站走 HTTPS,必须同时完成两件事:一是让 Nginx 在 443 端口正确提供 HTTPS 服务,二是把所有 80 端口的 HTTP 请求自动、完整地跳转过去。缺一不可,否则用户访问 http:// 会失败或卡住。
监听 443 端口并启用 SSL
这是 HTTPS 能工作的基础。你需要一个有效的证书(如 Let’s Encrypt 的 fullchain.pem 和 privkey.pem),并确保 Nginx 编译时启用了 http_ssl_module(主流发行版默认已包含)。
在 server 块中写明:
- listen 443 ssl; —— 明确启用 SSL,不能只写 listen 443
- server_name 要和你实际使用的域名一致(如 example.com www.example.com)
- ssl_certificate 和 ssl_certificate_key 指向证书文件的绝对路径
- 如果后端是反向代理(比如 Node.js、Python 应用),务必加上:
proxy_set_header X-Forwarded-Proto $scheme; —— 否则可能引发重定向循环
监听 80 端口并做 301 跳转
这不是可选步骤,而是强制统一入口的关键。单独建一个只监听 80 的 server 块,不做业务处理,只负责跳转:
- listen 80; —— 不加 ssl 参数
- return 301 https://$host$request_uri; —— 推荐用 return 而非 rewrite,更快更安全;$request_uri 自动保留路径和全部查询参数(比如 /login?next=/admin)
- server_name 必须与 443 块保持一致,否则跳转可能指向错误域名
验证是否生效
配置完成后别急着重启,先检查语法:
- 运行 nginx -t 确保无报错
- 执行 nginx -s reload 平滑重载
- 用 curl -I http://your-domain.com 测试响应头,应看到 HTTP/1.1 301 Moved Permanently 和 Location: https://...
- 打开浏览器开发者工具 → Network 标签,确认跳转链清晰、无循环、参数未丢失
补充安全建议
跳转只是第一步,还可以增强防护:
- 在 443 的 server 块中添加 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 避免在 80 块里写 location 或 root,保持它“纯跳转”职责单一
- 若使用 Nginx Proxy Manager,直接在 Web 界面勾选“Force SSL”即可自动生成等效配置,无需手动编辑


















