apache htaccess将http重定向到https,但不用于cloudflare

bq3bfh9z  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(134)

我有一个apache服务器,响应两种类型的网站,一种是通过cloudflare服务,其他网站直接从服务器服务。
我需要在htaccess中做一个测试,以检测客户端/访问者是否是cloudflare,如果是cloudflare请求,则不将http重定向到https
因为我知道cloudflare通过http向服务器(ip)发出所有请求,即使它在浏览器中显示https,而将其重定向到https会造成无限循环。
我试过这个:

RewriteCond %{HTTPS} off
RewriteCond %{ENV:HTTP_CDN_LOOP} !cloudflare
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L]

**EDIT:**正确的变量是%{HTTP:CDN-LOOP},将添加一个答案。

它会失败并创建一个无限循环,因为当cloudflare发出请求时,它也会重定向到https。也许%{ENV:HTTP_CDN_LOOP}htaccess环境中是错误的,我不确定如何翻译变量,这些是我在PHP $_SERVER中看到的相关变量:

[HTTP_CDN_LOOP] => cloudflare
[HTTP_X_FORWARDED_PROTO] => https
[HTTP_CF_RAY] => 76abb80fdef4etz5-FOO
[HTTP_CF_VISITOR] => {"scheme":"http"}
k4aesqcs

k4aesqcs1#

我在回答我自己的问题,因为我知道我会再次遇到这个问题并找到我的答案:)
htaccess的正确变量格式为%{HTTP:CDN-LOOP},因此仅将非Cloudlfare请求重定向到https的完整代码为:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:CDN-LOOP} !cloudflare
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301,L]

**注1:**默认情况下,cloudflare通过连接到IP的HTTP端口80向服务器发出请求。如果您将所有http请求重定向到https(没有上述条件),cloudflare请求可能会导致无限循环。
**注2:**即使添加了上述条件,最终用户(在浏览器中)仍然可以看到http地址。在cloudflare控制面板中启用“Always Use HTTPS”,使浏览器地址始终为https。

相关问题