Apache服务器HTACCESS配置:仅非Cloudflare请求HTTP转HTTPS
Apache .htaccess 配置:仅对非Cloudflare请求强制HTTPS重定向
你的场景是服务器同时托管两类站点:一类通过Cloudflare代理服务(Cloudflare向服务器发起的是HTTP请求,但浏览器端显示HTTPS),另一类直接对外提供服务。需要实现仅当请求不来自Cloudflare时,才将HTTP重定向至HTTPS,避免Cloudflare请求触发无限循环。
你之前的配置出错是因为用错了Apache变量:%{ENV:HTTP_CDN_LOOP}是访问环境变量的写法,而要读取请求头,应该用%{HTTP:Header-Name}的格式(请求头中的横杠替换为冒号)。以下是几种可靠的配置方案:
方案一:通过CDN-LOOP请求头判断
利用Cloudflare请求携带的CDN-LOOP头(对应PHP$_SERVER里的HTTP_CDN_LOOP),配置如下:
RewriteEngine On # 仅对非Cloudflare的HTTP请求执行HTTPS重定向 RewriteCond %{HTTPS} off RewriteCond %{HTTP:CDN-LOOP} !cloudflare [NC] RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L]
[NC]:不区分大小写,避免请求头值大小写不一致导致判断失效R=301:永久重定向,测试阶段建议改用R=302临时重定向,避免浏览器缓存影响调试NE:不转义URL中的特殊字符L:执行完这条规则后终止后续重写规则
方案二:通过CF-RAY请求头判断
Cloudflare代理的请求都会携带专属的CF-RAY头,通过检测该头是否存在来判断请求来源,稳定性更高:
RewriteEngine On RewriteCond %{HTTPS} off # 仅当请求头中没有CF-RAY时(非Cloudflare请求)执行重定向 RewriteCond %{HTTP:CF-RAY} ^$ RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L]
补充说明
- Cloudflare向服务器发起的请求中,
X-Forwarded-Proto头会标识浏览器端的协议(比如https),这也可以辅助验证请求是否来自Cloudflare,但上面两种方案已经足够覆盖需求。 - 配置完成后,建议用工具模拟非Cloudflare的HTTP请求测试重定向是否生效,同时确认Cloudflare代理的请求不会触发重定向,避免无限循环。
内容的提问来源于stack exchange,提问作者adrianTNT
相关产品推荐
相关产品推荐

