我想在我的网站上强制使用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.it从test
获取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
答案 0 :(得分:1)
由于您落后于代理%{HTTPS}
变量不可用。
要使其有效,您可以替换:
RewriteCond %{HTTPS} !=on
用这个:
RewriteCond %{HTTP:X-Forwarded-Proto} !https