Nginx 中 HTTP 到 HTTPS 的 301 跳转需用独立 listen 80 server 块执行 return 301 https://$host$request_uri;,同时确保 listen 443 ssl server 块正确配置证书与 HSTS,并通过 nginx -t 和 curl 验证生效。
在 Nginx 中实现 HTTP 到 HTTPS 的自动 301 跳转,核心是用独立的 listen 80 server 块执行跳转,不掺杂业务逻辑或 SSL 配置;同时确保另一个 listen 443 ssl server 块已正确启用并可响应。跳转必须保留原始域名和完整路径参数,避免 SEO 权重流失或用户访问中断。
这是最简洁、高效、无歧义的方式,Nginx 最新推荐用于永久重定向场景:
return 301 https://$host$request_uri;
$host 取请求头中的 Host 值,适配多域名、子域名或 CDN 回源场景$request_uri 自动包含路径 + 查询参数(如 /login?next=/admin),无需拼接 $args
ssl_certificate、ssl on 或任何 location 处理,否则会报错或失效跳转只是引导,最终服务必须由 443 端口的 HTTPS server 提供:
listen 443 ssl http2;(http2 可选但推荐)ssl_certificate 指向 fullchain.pem,ssl_certificate_key 指向 privkey.pemadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
改完不是 reload 就完事,漏掉验证容易导致白屏或跳转失败:
nginx -t:确认语法正确、证书文件可读、端口未被占用nginx -s reload 或 systemctl reload nginx
curl -I http://yourdomain.com/test?x=1 查看是否返回 301 Moved Permanently 和正确的 Location 头很多问题其实卡在细节上,不是配置逻辑错,而是环境没对齐:
chmod 644 privkey.pem)→ nginx 启动失败或 HTTPS 不响应rewrite 替代 return → 可能因正则匹配或变量解析出错,尤其在有 CDN 时易触发双重跳转