最直接有效的方式是在Nginx 80端口server块中用return 301跳转至HTTPS并保留路径与参数,同时需配置独立443 ssl server块并正确设置证书、TLS协议及加密套件。

最直接有效的方式,是在 Nginx 的 80 端口 server 块中使用 return 301 指令,把所有 HTTP 请求永久跳转到对应的 HTTPS 地址,并完整保留原始路径和查询参数。
配置监听 80 端口的跳转规则
在 Nginx 配置文件中添加或修改一个监听 80 端口的 server 块:
-
必须写明
listen 80;,确保能接收 HTTP 请求 -
用
return 301 https://$host$request_uri;——$host动态取请求头中的 Host 值,适配多域名;$request_uri包含完整路径和 ? 后全部参数,无需额外拼接 - 避免硬编码域名,比如不要写
https://example.com$request_uri,否则泛域名或多个server_name会失效 - 该指令不走 rewrite 流程,性能高、语法稳、Nginx 1.0+ 全支持
单独配置监听 443 的 HTTPS 服务
跳转只是引导,HTTPS 本身必须可用。需另建一个 server 块监听 443 端口并启用 SSL:
-
必须写
listen 443 ssl;(新版写法),旧版可写listen 443; ssl on; -
正确指定证书路径:
ssl_certificate和ssl_certificate_key指向你的 .crt 和 .key 文件 -
启用安全协议与加密套件:例如
ssl_protocols TLSv1.2 TLSv1.3;和ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:...; - 若证书是自签名的(如本地开发),浏览器会提示不安全,但跳转逻辑仍可正常工作
代理环境下的补充处理(如 CDN、ALB、Traefik)
当 Nginx 前面有 HTTPS 终结代理时,用户发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 $scheme 恒为 http,80 端口跳转无法触发。需在 443 的 server 块中加:
-
启用
error_page 497 =301 https://$host$request_uri;——497 是 Nginx 检测到“HTTP 请求打到了 HTTPS 端口”时返回的错误码 -
确保代理透传
X-Forwarded-Proto: https,Nginx 才能识别原始协议 - 若代理 Header 含下划线(如
X-Forwarded-For),需在 http 或 server 块顶部加underscores_in_headers on; - 该配置不替代 80 端口跳转,而是与之共存:直连用户走 80,代理流量走 497
验证与生效前检查
改完配置别急着 reload,先做这几步:
-
备份原配置:例如
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak -
语法检测:运行
nginx -t,确认输出 “syntax is ok” 和 “test is successful” -
测试跳转:用
curl -I http://your-domain.com/test?x=1,观察是否返回301 Moved Permanently且Location头正确包含 HTTPS 地址和完整参数 -
确认 HTTPS 可访问:直接用浏览器或 curl 访问
https://your-domain.com,看是否能加载页面、无证书告警(如用自签名证书,需手动信任)











