我试图在htaccess中强制使用非www https,但我发现的每个示例都抛出错误“太多重定向”
我想重定向:
http://www.example.com
http://example.com
https://www.example.com
致:
https://example.com
我找到的最好的解释是:
https://simonecarletti.com/blog/2016/08/redirect-domain-http-https-www-apache/
...给出了以下示例:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
感谢解释我明白它在做什么,但我仍然得到同样的错误-太多的重定向。
我所能做的最好的事情是:
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
...但当然这不会重定向http://example.com
。
我没有在httpd.conf
中设置重定向,也没有在Plesk中设置重定向。我使用的是CentOS 6.8、Apache 2.2.15、Plesk 12.5。
问题的原因可能是什么?
1条答案
按热度按时间zazmityj1#
使用http://或**https://**时,将
RewriteCond
和您指定的RewriteRule
相加得到?off_example.com
。这是预期的吗?不,这不是预期的结果-这才是问题所在。
HTTPS
在通过https://...
访问时应该是on
。如果HTTPS
* 服务器变量 * 从未设置为"on"(或者更确切地说,从未从"off"更改),则RewriteRule
将导致重定向循环。这意味着"Let's Encrypt addon in Plesk"是通过某种"代理"(前端)服务器实现的?您的应用服务器仍然通过未加密的HTTP响应代理,客户端到代理的连接通过HTTPS加密。至少看起来是这样-但您的主机应该能够确认这一点。
如果是这种情况,那么代理通常会设置附加的HTTP请求头,其中包含有关客户端连接的详细信息。您应该能够检查应用程序看到的请求头,但是通常使用正在使用的协议来设置
X-Forwarded-Proto
报头("http"或"https")。如果是这种情况,那么您可以将现有的指令更改为如下所示的内容:另一种不太常用的方法是将(前端)服务器设置
HTTPS
* 环境变量 *(可能是provided by mod_ssl?)-请注意,这与上面提到的名称类似的HTTPS
* 服务器变量 * 不同。此 * 环境变量 * 使用mod_rewrite指令中的语法%{ENV:HTTPS}
进行访问,如果设置了此语法,包含的值与HTTPS
* 服务器变量 * 提供的值相同。例如:动态/任何域
如何使用动态域进行此操作?我有多个域,我希望此指令可以在这些域上工作
添加始终匹配的第三个 * condition *(
RewriteCond
指令),以捕获域名(不包括任何www.
子域)并相应地更改RewriteRule
指令。例如:
其中,* substitution * 字符串中的
%1
反向引用包含从前面的 * condition *(RewriteCond
指令)捕获的子模式。对于FQDN,正则表达式
^(?:www\.)?(.+?)\.?$
还排除了最后一个点(如果有)。