最简跳转方案是用return 301指令在80端口server块中配置return 301 https://$host$request_uri;,动态获取host并完整保留路径与参数,同时需独立配置443 ssl server块并确保证书有效。

用 return 301 实现最简跳转
这是当前生产环境的首选方案,语法干净、执行快、不触发 rewrite 引擎,也不依赖正则匹配。在监听 80 端口的 server 块里只写一行:return 301 https://$host$request_uri;。
关键点:
-
$host动态取请求头中的 Host 值,比$server_name更可靠——尤其当你配置了多个域名或泛域名时 -
$request_uri包含完整路径和查询参数(?a=1&b=2),不用额外拼$args,避免漏参 - 该指令在 Nginx 1.0+ 全版本支持,无需开启 PCRE 或 rewrite 模块
- 不要在同一个
server块里混写listen 80和ssl on,新版 Nginx 会报错
确保 listen 443 ssl server 块真正可用
跳转只是引导,HTTPS 服务本身挂了,用户点进去就是连接失败或证书告警。必须存在一个独立的 server 块监听 443 端口,并正确加载证书。
常见配置要点:
- 必须有
listen 443 ssl;(Nginx 1.15+ 不再支持ssl on;) -
ssl_certificate和ssl_certificate_key路径要准确,且 Nginx 进程有读权限(比如私钥不能是600但属主不是nginx) - 推荐启用 TLSv1.2 和 TLSv1.3:
ssl_protocols TLSv1.2 TLSv1.3; - 若使用 Let’s Encrypt,证书路径通常是
/etc/letsencrypt/live/example.com/fullchain.pem和privkey.pem
代理环境下要用 error_page 497 补充处理
当 Nginx 前面有 CDN、ALB 或 Traefik 时,用户发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 $scheme 是 http,80 端口跳转完全不生效。
解决方法是在 443 的 server 块内加一句:error_page 497 =301 https://$host$request_uri;。
同时注意:
- 代理必须透传
X-Forwarded-Proto: https头,否则 Nginx 无法判断原始协议 - 如果代理用了带下划线的 Header(如
X-Forwarded-For),需在 http 块开头加underscores_in_headers on; - 这个配置不是替代 80 端口跳转,而是并存:直连走 80 → 301,代理流量走 497 → 301
验证前必须做的三件事
改完配置别急着 reload,先过这三关,能避开 90% 的线上故障。
第一步:备份原配置: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 头里的 URL 完整、协议正确、参数未丢
最容易被忽略的是证书文件权限和代理层 Header 透传——这两处出问题,现象都是跳转成功但 HTTPS 页面打不开,排查时容易绕远路。











