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

目录
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. 无限重定向循环是怎么形成的?
完整循环如下:
- Cloudflare 使用 HTTP 请求源站(因为 Flexible 强制用 HTTP)
- 源站收到 HTTP 请求 → 检测到未加密 → 强制跳转到 HTTPS
- 源站返回 301 到
https://yourdomain.com - Cloudflare 收到 301 再请求源站,但依然只能使用 HTTP
- 源站再次跳回 HTTPS
- Cloudflare 再用 HTTP 请求
- 如此循环 → 无限 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)。



