【问题标题】:HTACCESS Rewrite Rule Results in a Redirect LoopHTACCESS 重写规则导致重定向循环
【发布时间】:2019-09-16 20:02:18
【问题描述】:

我已经在 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] => on

我想知道为什么RewriteCond %{HTTPS} off [OR] 总是返回 true,即使通过 HTTPS 访问 URL 并且设置了环境变量?

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

【问题讨论】:

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


    【解决方案1】:

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

    而且这个变量不是环境变量,所以你的SetEnvIf 不能被识别,你应该写%{ENV:HTTPS}。但是,值得注意的是,SetEnvIf 是在 mod_rewrite 之后解释的,所以它也不起作用。

    如您所见,就您而言,正确的方法是使用RewriteCond %{HTTP:X-Forwarded-Proto} !=https [NC]

    【讨论】:

      猜你喜欢
      • 2017-08-16
      • 2013-06-25
      • 1970-01-01
      • 2011-02-16
      • 2016-04-25
      • 1970-01-01
      • 2017-12-17
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多