.htaccess HTACCESS重写规则导致重定向循环

.htaccess HTACCESS重写规则导致重定向循环,.htaccess,nginx,mod-rewrite,apache2,reverse-proxy,.htaccess,Nginx,Mod Rewrite,Apache2,Reverse Proxy,我已经在NGINX代理后面设置了Apache,我的HTTPS重定向(重写)规则会导致重定向循环。看起来,尽管我正确设置了环境变量,但HTTPS返回为false 我的重写规则: RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] 我的环境变量: SetEnvIf X-Forwar

我已经在NGINX代理后面设置了Apache,我的HTTPS重定向(重写)规则会导致重定向循环。看起来,尽管我正确设置了环境变量,但HTTPS返回为false

我的重写规则:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
我的环境变量:

SetEnvIf X-Forwarded-Proto https HTTPS=on
SetEnvIf X-Forwarded-SSL on HTTPS=on
当我在PHP中执行
var_dump
时,我可以看到变量设置正确:

[HTTPS]=>打开
我想知道为什么
RewriteCond%{HTTPS}off[或]
总是返回true,即使URL是通过HTTPS访问的,并且环境变量已设置


p、 作为修复,如果我使用
RewriteCond%{HTTP:X-Forwarded-Proto}!https[NC]
代替
RewriteCond%{https}off[OR]
,重定向循环消失。

变量
%{https}
的值由mod_ssl处理,但在您的情况下,由于https由nginx而不是Apache处理,
%{https}
off

此外,此变量不是环境变量,因此无法识别您的
setenif
,您应该编写
%{ENV:HTTPS}
。但是,值得注意的是,
setenif
是在mod_重写之后解释的,因此它也不会工作

正如您所发现的,在您的情况下,正确的方法是使用
RewriteCond%{HTTP:X-Forwarded-Proto}=https[NC]