HTACCESS重写规则结果在重定向循环中

时间:2019-04-27 15:55:00

标签: .htaccess nginx mod-rewrite apache2 reverse-proxy

我已经在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],重定向循环就会消失。

1 个答案:

答案 0 :(得分:1)

%{HTTPS}的值由mod_ssl处理,但在您的情况下,由于https由nginx而非Apache处理,%{HTTPS}off

此变量也不是环境变量,因此无法识别您的SetEnvIf,您应该编写%{ENV:HTTPS}。但是,值得注意的是SetEnvIf是在mod_rewrite之后进行解释的,因此它也不起作用。

根据您的情况,正确的方法是使用RewriteCond %{HTTP:X-Forwarded-Proto} !=https [NC]