我已经在NGINX代理后面设置了Apache,并且我的HTTPS重定向(重写)规则导致了重定向循环。尽管我正确设置了环境变量,但看来HTTPS
返回的还是假的。
我的重写规则:
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] => on
我想知道为什么RewriteCond %{HTTPS} off [OR]
始终返回true,即使通过HTTPS访问URL并设置了环境变量也是如此?任何帮助将不胜感激。
p.s。作为解决方法,如果我使用RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
代替RewriteCond %{HTTPS} off [OR]
,重定向循环就会消失。
答案 0 :(得分:1)
%{HTTPS}
的值由mod_ssl处理,但在您的情况下,由于https由nginx而非Apache处理,%{HTTPS}
为off
。
此变量也不是环境变量,因此无法识别您的SetEnvIf
,您应该编写%{ENV:HTTPS}
。但是,值得注意的是SetEnvIf
是在mod_rewrite之后进行解释的,因此它也不起作用。
根据您的情况,正确的方法是使用RewriteCond %{HTTP:X-Forwarded-Proto} !=https [NC]
。