apache 在htaccess重定向中强制使用非www和HTTPS会导致重定向过多

tkclm6bt  于 2023-01-26  发布在  Apache
关注(0)|答案(1)|浏览(152)

我试图在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。
问题的原因可能是什么?

zazmityj

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")。如果是这种情况,那么您可以将现有的指令更改为如下所示的内容:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]

另一种不太常用的方法是将(前端)服务器设置HTTPS * 环境变量 *(可能是provided by mod_ssl?)-请注意,这与上面提到的名称类似的HTTPS * 服务器变量 * 不同。此 * 环境变量 * 使用mod_rewrite指令中的语法%{ENV:HTTPS}进行访问,如果设置了此语法,包含的值与HTTPS * 服务器变量 * 提供的值相同。例如:

RewriteEngine On
RewriteCond %{ENV:HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
    • 更新日期:**

动态/任何域

如何使用动态域进行此操作?我有多个域,我希望此指令可以在这些域上工作
添加始终匹配的第三个 * condition *(RewriteCond指令),以捕获域名(不包括任何www.子域)并相应地更改RewriteRule指令。
例如:

:
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

其中,* substitution * 字符串中的%1反向引用包含从前面的 * condition *(RewriteCond指令)捕获的子模式。
对于FQDN,正则表达式^(?:www\.)?(.+?)\.?$还排除了最后一个点(如果有)。

相关问题