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

最直接有效的方式,是在 Nginx 的 80 端口 server 块中使用 return 301 指令,将所有 HTTP 请求永久跳转到对应的 HTTPS 地址,同时完整保留原始路径和查询参数。
用 return 301 实现高效跳转
这是当前生产环境的首选方案,语法简洁、执行快、不依赖正则引擎,且语义明确。
- 在监听 80 端口的 server 块中写入:
return 301 https://$host$request_uri; -
$host动态获取请求头中的 Host 值,适配多域名或泛域名场景,比硬编码$server_name更稳妥 -
$request_uri包含完整 URI(路径 + ? 后全部参数),无需额外拼接$args,避免漏参 - 该指令不触发 rewrite 流程,性能开销最小,Nginx 1.0+ 全版本支持
确保 HTTPS 服务本身可用
跳转只是前端引导,后端 HTTPS 服务必须正常响应,否则用户会看到连接失败或证书错误。
- 必须存在一个独立的
listen 443 sslserver 块 - 正确配置证书路径:
ssl_certificate和ssl_certificate_key - 启用 TLS 协议与加密套件,例如:
ssl_protocols TLSv1.2 TLSv1.3;和ssl_ciphers ...; - 若使用旧版 Nginx(ssl on;;新版推荐直接写
listen 443 ssl;
注意代理环境下的特殊处理
当 Nginx 前面有 CDN、ALB 或 Traefik 等 HTTPS 终结代理时,用户实际发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 $scheme 恒为 http,不能靠 80 端口跳转解决。
- 应启用
error_page 497 =301 https://$host$request_uri;,放在 443 server 块内 - 代理需透传
X-Forwarded-Proto: https头,Nginx 中可配合map判断协议 - 若代理 Header 含下划线(如
X-Forwarded-For),需开启underscores_in_headers on; - 该方式不替代 80 端口配置,而是补充——直连用户走 80 跳转,代理流量走 497 捕获
验证与上线前检查
配置生效前务必做基础验证,避免服务中断或跳转异常。
- 修改前备份原配置:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak - 运行
nginx -t检查语法,确认输出 “syntax is ok” 和 “test is successful” - 用 curl 测试跳转:
curl -I http://example.com/test?x=1,观察是否返回 301 且 Location 正确 - 检查浏览器地址栏是否自动变为 HTTPS,且参数未丢失(如
?id=123&ref=test)











