一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中 301 重定向如何将 HTTP 访问自动重定向跳转到安全 HTTPS

时间:2026-08-23 11:57:49 编辑:袖梨 来源:一聚教程网

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 权重流失或用户访问中断。

只在 80 端口 server 块中用 return 301

这是最简洁、高效、无歧义的方式,Nginx 最新推荐用于永久重定向场景:

  1. 写法示例:return 301 https://$host$request_uri;
  2. $host 取请求头中的 Host 值,适配多域名、子域名或 CDN 回源场景
  3. $request_uri 自动包含路径 + 查询参数(如 /login?next=/admin),无需拼接 $args
  4. 绝对不要在这个块里加 ssl_certificatessl on 或任何 location 处理,否则会报错或失效

HTTPS server 块必须独立且可用

跳转只是引导,最终服务必须由 443 端口的 HTTPS server 提供:

  1. 监听配置:必须写 listen 443 ssl http2;http2 可选但推荐)
  2. 证书路径要准确:ssl_certificate 指向 fullchain.pem,ssl_certificate_key 指向 privkey.pem
  3. 建议加上 HSTS 安全头:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  4. 该 server 块不能与 HTTP 块合并,也不能在其中再写 return 301 跳转逻辑,否则可能引发循环

验证配置是否生效

改完不是 reload 就完事,漏掉验证容易导致白屏或跳转失败:

  1. 先运行 nginx -t:确认语法正确、证书文件可读、端口未被占用
  2. 再执行 nginx -s reloadsystemctl reload nginx
  3. curl -I http://yourdomain.com/test?x=1 查看是否返回 301 Moved Permanently 和正确的 Location
  4. 浏览器访问 HTTP 地址,地址栏应立刻变为 HTTPS,锁图标正常,且参数不丢失

注意常见陷阱

很多问题其实卡在细节上,不是配置逻辑错,而是环境没对齐:

  1. 防火墙未开放 443 端口 → 用户跳过去连不上,显示空白或连接超时
  2. 私钥权限不对(比如 chmod 644 privkey.pem)→ nginx 启动失败或 HTTPS 不响应
  3. 误用 rewrite 替代 return → 可能因正则匹配或变量解析出错,尤其在有 CDN 时易触发双重跳转
  4. CDN 已开启“强制 HTTPS”,源站又做一次 301 → 浏览器可能拦截跳转或首屏变慢

热门栏目