Cloudflare灵活SSL环境下强制HTTP遇循环重定向问题求助
我来帮你搞定这个头疼的循环重定向问题——这在Cloudflare灵活SSL搭配“始终使用HTTPS”规则时确实很常见,咱们分两种方案来解决,优先推荐Cloudflare专属配置,再给你有效的.htaccess规则。
Cloudflare专属解决方案(无需修改源站)
首先得搞清楚循环的根源:灵活SSL模式下,Cloudflare和用户浏览器之间是HTTPS,但Cloudflare到你的源站是HTTP。如果你的页面规则“始终使用HTTPS”和源站的响应逻辑冲突,就会触发循环。按以下步骤调整:
确认SSL模式为“灵活”
登录Cloudflare后台,进入你的域名 →SSL/TLS→Overview,确保SSL模式是灵活(这是前提,其他模式会要求源站有HTTPS证书)。替换页面规则为Cloudflare内置的“自动HTTPS重定向”
不要用自定义页面规则来做“始终HTTPS”,改用Cloudflare官方更智能的功能:进入SSL/TLS→Edge Certificates,找到“自动HTTPS重定向”并开启。这个功能会识别Cloudflare的请求上下文,避免向源站发送不必要的HTTPS重定向,从根源上防止循环。清除Cloudflare缓存
调整设置后,进入Caching→Configuration,点击“清除缓存”里的“清除全部内容”,确保旧的规则缓存被清空。检查源站是否强制HTTPS(非.htaccess层面)
如果你的服务器(比如Apache虚拟主机、Nginx配置)本身有强制HTTPS的设置,需要暂时关闭——灵活模式下源站只需要处理HTTP请求即可。
有效的.htaccess强制HTTP规则(针对源站)
如果你必须通过.htaccess来控制,之前的规则问题在于没有区分Cloudflare请求和直接访问的请求,导致所有请求都被强制HTTP,包括用户直接访问源站的情况,从而引发页面不可用。试试下面的规则:
RewriteEngine On # 1. 非Cloudflare的请求(直接访问源站IP/域名)重定向到HTTPS(通过Cloudflare) RewriteCond %{HTTP:CF-Connecting-IP} ^$ RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] # 2. Cloudflare的请求强制返回HTTP(避免源站自身的HTTPS重定向引发循环) RewriteCond %{HTTP:CF-Connecting-IP} !^$ RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
规则解释:
CF-Connecting-IP是Cloudflare专属的请求头,只有Cloudflare转发的请求才会携带这个头。- 第一条规则:如果是用户直接访问源站(没有Cloudflare的头),就重定向到HTTPS(让请求走Cloudflare的SSL)。
- 第二条规则:如果是Cloudflare的请求,且源站意外开启了HTTPS,就强制重定向回HTTP,确保Cloudflare拿到的是HTTP响应,不会触发循环。
额外注意事项
- 如果你用的是Nginx服务器,对应的配置逻辑类似,需要检查
$http_cf_connecting_ip变量来判断是否是Cloudflare请求。 - 测试时可以用浏览器的开发者工具(Network面板)查看重定向链,确认是否还有循环。
内容的提问来源于stack exchange,提问作者xaxiv

