为什么 Cloudflare 的 SSL 设为 Flexible(灵活)时会出现“重定向次数过多”?

实用教程 admin 3小时前 8次浏览 0个评论

当 Cloudflare 使用 Flexible SSL,而你的本地服务器又启用了 HTTPS 证书(自签或正规证书)时,会产生协议冲突,从而触发无限 301/302 重定向。

image-20251116002243707

1. Cloudflare Flexible SSL 的真实行为

当 SSL 模式为 Flexible 时:

访客 → Cloudflare:HTTPS  
Cloudflare → 源站服务器:HTTP(永远不会访问 https://)

关键点:

  • Cloudflare 不会使用 HTTPS 去访问你的服务器
  • 即使你本地已经启用 HTTPS 证书,也完全不会被使用

2. 当源站启用了 HTTPS,会发生什么?

多数服务器(Nginx/Apache)在启用 HTTPS 后,都会配置:

HTTP → HTTPS 的强制跳转(301/302)

例如:

http://example.com → https://example.com

此时 Cloudflare(Flexible)访问源站时用的是 http://源站,于是冲突开始出现。

3. 无限重定向循环是怎么形成的?

完整循环如下:

  1. Cloudflare 使用 HTTP 请求源站(因为 Flexible 强制用 HTTP)
  2. 源站收到 HTTP 请求 → 检测到未加密 → 强制跳转到 HTTPS
  3. 源站返回 301 到 https://yourdomain.com
  4. Cloudflare 收到 301 再请求源站,但依然只能使用 HTTP
  5. 源站再次跳回 HTTPS
  6. Cloudflare 再用 HTTP 请求
  7. 如此循环 → 无限 301 → 浏览器报错

典型错误:

ERR_TOO_MANY_REDIRECTS

4. 解决办法(任选一个即可)

方案一:把 Cloudflare SSL 模式改为 Full 或 Full (Strict)(推荐)

如果你的服务器已经启用 HTTPS,这是最正确的方式。

路径:

Cloudflare → SSL/TLS → Overview

把模式改成:

  • Full
  • Full (Strict)(如果你使用正规证书,强烈推荐)

优点:

  • 立即停止无限重定向
  • 更安全
  • 性能更好(支持 HTTP/2 / HTTP/3)

方案二:继续使用 Flexible,但是关闭源站的 HTTP→HTTPS 跳转(不推荐)

要避免循环,源站必须允许 HTTP 原样访问。

你需要删除 Nginx 等配置中的跳转规则,例如:

return 301 https://$host$request_uri;

缺点:

  • 源站将变成不安全的 HTTP
  • Flexible 本身就是半加密模式,不建议生产环境使用

5. 总结

Cloudflare Flexible 使用 HTTP 访问你的源站。
你的服务器又把 HTTP 强制跳转到 HTTPS。
两者协议不一致 → 无限重定向循环。

最简单的解决方式:

**把 Cloudflare 改成 Full 或 Full (Strict)。


喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址