强制HTTPS会导致过多的重定向,但会使用查询字符串进行修复

时间:2018-02-05 14:28:27

标签: apache .htaccess redirect mod-rewrite https

我想在我的网站上强制使用SSL。

我在实时网站所需的网络根目录/ htaccess文件中有一堆重写规则,因此我将测试分离到/test文件夹,其中包含一个htaccess文件它

test htaccess中,我没有 RewriteOptions Inherit,因此不会应用根重写规则。为了验证这一点,我在根htaccess中添加了一条规则,将test重写为不存在的页面。如果我删除test下的htaccess,我会得到预期的404.如果我将其添加回来,我将不再获得404.因此,根规则(以及所有其余的)不会应用且不会混淆SSL的事情。

所以这就是我在test/.htaccess中所拥有的:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302]

当我导航到example.com/test时,我被重定向到https://example.com/test/,错误为ERR_TOO_MANY_REDIRECTS

但是,如果我使用查询字符串作为标志来防止多个重定向:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{QUERY_STRING} !rd
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}?rd [R=302]

我成功地从example.com/test重定向到https://example.com/test/?rd,没有任何错误,我可以在那里看到HTML页面。

看来这个规则:

RewriteCond %{HTTPS} off

无效。

问题

有什么问题?我如何解决它?是一些服务器配置错误吗?

修改:当我var_dump($_SERVER['HTTPS'])时,我在https时获得NULL,而在https时获得on。它永远不会off。但是,即使我改变了规则:

RewriteCond %{HTTPS} off

为:

RewriteCond %{HTTPS} !=on

我仍然得到错误。

此外,我正在使用开放式工具打开,禁用缓存和隐身模式进行测试。这也是我使用302重定向而不是301的原因 - 以防止缓存。

编辑2: Apache版本为2.2.22,我不允许更新它。这意味着我无法使用:

RewriteCond %{REQUEST_SCHEME} http$
建议

编辑3 :我使用Hurl.ittest获取http:

下的响应标头
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 110
Content-Type: text/html; charset=UTF-8
Date: Mon, 05 Feb 2018 15:12:07 GMT
Server: nginx
Vary: Accept-Encoding

1 个答案:

答案 0 :(得分:1)

由于您落后于代理%{HTTPS}变量不可用。

要使其有效,您可以替换:

RewriteCond %{HTTPS} !=on

用这个:

RewriteCond %{HTTP:X-Forwarded-Proto} !https