Cloudflare「灵活」SSL模式与宝塔「强制HTTPS」叠加导致301循环跳转,应将Cloudflare SSL模式改为「完全」或「完全(严格)」并关闭宝塔强制HTTPS及清理Nginx重定向规则。

宝塔强制 HTTPS 和 Cloudflare 重定向冲突时的表现
浏览器报 ERR_TOO_MANY_REDIRECTS 或状态码 310,但网站本身 Nginx 配置看起来没问题——大概率是宝塔「强制 HTTPS」和 Cloudflare 的 SSL 模式在互相触发跳转。典型路径是:用户 → Cloudflare(HTTP → HTTPS)→ 宝塔(又判断为 HTTP → 再跳一次 HTTPS),形成循环。
- Cloudflare 默认开启「自动 HTTPS 重写」,哪怕你没配任何规则,它也会把进来的 HTTP 请求 301 到 HTTPS
- 宝塔面板里点开网站 → SSL → 开启了「强制 HTTPS」,Nginx 配置会插入
return 301 https://$host$request_uri;这类规则 - 两者叠加,一次请求至少触发两次 301,浏览器限制通常为 20 次,实际到第 5–6 次就直接报错
Cloudflare 后台必须改的两个关键设置
不是关代理(灰色云朵),而是调 SSL/TLS 模式。Cloudflare 的「SSL/TLS 加密模式」决定了它和源站之间如何协商协议,直接影响是否额外触发重定向。
- 进入 Cloudflare 控制台 → 你的域名 → SSL/TLS → 概览 → 把加密模式从「灵活」改成「完全」或「完全(严格)」
- 「灵活」模式会让 Cloudflare 用 HTTP 访问你的宝塔服务器(即使你开了强制 HTTPS),结果就是:Cloudflare 收到 HTTP → 强制跳 HTTPS → 宝塔又收到 HTTP → 再跳 HTTPS → 死循环
- 「完全」及以上模式要求 Cloudflare 到源站也走 HTTPS,绕过了中间的 HTTP 环节,自然消除了二次跳转
- 如果选「完全(严格)」,需确保宝塔已正确安装有效 SSL 证书(不能是自签名或过期证书),否则 Cloudflare 会拒绝连接
宝塔端要同步关闭或检查的配置项
Cloudflare 设置改完后,宝塔这边不一定非要关「强制 HTTPS」,但必须确认它不和 CDN 行为打架。最稳妥的做法是关掉,让 Cloudflare 统一处理外层 HTTPS。
- 宝塔后台 → 网站 → 找到对应站点 → 点击「设置」→「SSL」→ 关闭右上角的「强制 HTTPS」开关
- 别只信开关状态:点击「配置文件」,搜索
return 301 https或rewrite ^(.*)$ https://$host$1 permanent,手动删掉这类规则(尤其注意server块里非 SSL 的那个监听块) - 如果你用的是多级域名(比如
www和根域同时存在),检查是否两个域名都绑定了证书,且都开了强制 HTTPS —— 这会导致www.example.com→example.com→ 又跳回www的循环 - 确认宝塔的「网站目录」里没有残留的
.htaccess(Apache 场景)或redirect类伪静态规则,它们可能在 Nginx 层之下悄悄补刀
验证和容易被忽略的细节
改完别急着刷网页,先用命令行确认真实跳转链。很多问题卡在缓存或配置未生效上。
- 用
curl -I http://yourdomain.com看响应头,正常应返回301且Location: https://...仅一次;如果出现多次301或https://https://...这种畸形地址,说明某处规则写错了 - Cloudflare 的「缓存清除」按钮要点一次,它的边缘节点可能缓存了旧的重定向响应
- 本地 hosts 文件若绑定了 IP,记得临时注释掉,避免绕过 Cloudflare 直连宝塔,导致测试失真
- 如果用了腾讯云 CDN、又套了 Cloudflare,得同步检查腾讯云 CDN 的「访问 URL 重写」是否开着 —— 多层 CDN + 宝塔强制 HTTPS 是高危组合
真正卡住人的往往不是某个开关没关,而是 Cloudflare 模式选错 + 宝塔配置没清干净 + CDN 缓存没刷新,三者叠在一起,看日志都看不出哪一步先发起的跳转。










