最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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 最新推荐用于永久重定向场景:
- 写法示例:
return 301 https://$host$request_uri; -
$host取请求头中的 Host 值,适配多域名、子域名或 CDN 回源场景 -
$request_uri自动包含路径 + 查询参数(如/login?next=/admin),无需拼接$args - 绝对不要在这个块里加
ssl_certificate、ssl on或任何location处理,否则会报错或失效
HTTPS server 块必须独立且可用
跳转只是引导,最终服务必须由 443 端口的 HTTPS server 提供:
- 监听配置:必须写
listen 443 ssl http2;(http2可选但推荐) - 证书路径要准确:
ssl_certificate指向 fullchain.pem,ssl_certificate_key指向 privkey.pem - 建议加上 HSTS 安全头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 该 server 块不能与 HTTP 块合并,也不能在其中再写 return 301 跳转逻辑,否则可能引发循环
验证配置是否生效
改完不是 reload 就完事,漏掉验证容易导致白屏或跳转失败:
- 先运行
nginx -t:确认语法正确、证书文件可读、端口未被占用 - 再执行
nginx -s reload或systemctl reload nginx - 用
curl -I http://yourdomain.com/test?x=1查看是否返回301 Moved Permanently和正确的Location头 - 浏览器访问 HTTP 地址,地址栏应立刻变为 HTTPS,锁图标正常,且参数不丢失
注意常见陷阱
很多问题其实卡在细节上,不是配置逻辑错,而是环境没对齐:
- 防火墙未开放 443 端口 → 用户跳过去连不上,显示空白或连接超时
- 私钥权限不对(比如
chmod 644 privkey.pem)→ nginx 启动失败或 HTTPS 不响应 - 误用
rewrite替代return→ 可能因正则匹配或变量解析出错,尤其在有 CDN 时易触发双重跳转 - CDN 已开启“强制 HTTPS”,源站又做一次 301 → 浏览器可能拦截跳转或首屏变慢