我编写以下.htaccess
规则将所有 URL 重定向www.a.com
到www.b.com
:
RewriteEngine on
RewriteCond %{http_host} ^www.a.com [NC,OR]
RewriteCond %{http_host} ^a.com [NC]
RewriteRule ^(.*)$ https://www.b.com/myfolder/ [R=301,NC,L]
现在 的子目录下有一个文件a.com
,如下:
www.a.com/.well-known/acme-challenge/#######
它用于 AutoSSL 续订。通过上述重定向,AutoSSL 将无法再找到该文件,因此更新失败。
那么,是否可以禁用下面的重定向/.well-known/acme-challenge/
?
由于您将所有内容重定向到固定的 URL 路径,因此您也可以直接在
RewriteRule
指令中构建异常(无需像当前那样捕获 URL 路径)。例如:
模式
!
上的前缀否定表达式,因此当正则表达式不匹配时成功。在这种情况下,当请求的 URL 路径未开始时。(但是,请参阅下面的“边缘情况”。)RewriteRule
.well-known/acme-challenge/
我还将您的两个条件(
RewriteCond
指令)合二为一。NC
规则本身不需要该标志(假设您使用的是 Linux,而不是 Windows)。请记住在正则表达式中反斜杠转义文字点。
边缘盒(可选额外)
请注意,如果文件后面还有前端控制器模式
.htaccess
(例如 WordPress、Joomla、大多数其他框架/CMS 等),那么您还应该向上述规则添加一个条件,以防止重写前端控制器请求表单的 URL 时被重定向/.well-known/acme-challenge/<non-existent-file>
。例如:如果没有这个条件,则请求
http://a.com/.well-known/acme-challenge/<non-existent-file>
将被重定向到https://www.b.com/index.php
(假设index.php
是前端控制器)。概括
完整的规则将变为:
更新:
由于简单
Redirect
(mod_alias) 指令本身不提供创建“例外”的功能,因此您需要将该指令包含在表达式中<If>
(需要 Apache 2.4)。例如:参考: https: //httpd.apache.org/docs/2.4/expr.html
(如果您使用
Redirect
这样的指令,那么就没有“前端控制器”模式,也没有上面提到的“边缘情况”。)旁白:虽然它们可能看起来相似,但该
Redirect
指令与之前使用的指令有很大不同RewriteRule
,并产生不同的结果。RewriteRule
上面的指令丢弃请求的 URL 路径,将所有内容重定向到https://www.b.com/myfolder/
. 但是,Redirect
此处使用的指令保留了请求的 URL 路径,并在 URL 路径前添加前缀/myfolder
(例如,/foo/bar
重定向到https://www.b.com/myfolder/foo/bar
)