我有.htaccess
中的这组规则,由Apache 2.4.33处理:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(subdomain\.olddomain)\.com$ [NC]
RewriteRule ^ https://www.example.com/directory/%1%{REQUEST_URI} [R=301,L]
## for some of the specific rules below
RewriteBase /
<If "%{HTTP_HOST} =~ /^(?:.*\.)?olddomain\.(?:com|net)$/i">
## some other specific rules which do not fire
RewriteRule ^ https://%1example.com/directory%{REQUEST_URI} [R=301,L]
</If>
但是,似乎具有通用规则集的If
块优先,尽管它遵循更具体的第一个重写为不同URL并以L
结尾的块。
将(?:.*\.)?
更改为(?:www\.)?
会按预期工作。同样,如果将第一个规则集移到If
块中(反正代码效率更高,但是事情已经发展了)。
我已经阅读了this个帖子,我了解了这些帖子,但不适用于此处,因为第一条规则(如果被解雇)应该重写域/主机,因此与{{ 1}}的条件了。
@covener对this发布的评论也提到了变量/模块的优先级,但是是否有更通用的文档? (我已经阅读了有关TFM中表达式的指令和参考文章,也注意到了If
认证之前的备注。)
TIA进行任何建议的解释。
答案 0 :(得分:1)
这看起来像是指令如何合并的另一种微妙行为,另一种行为是mod_rewrite有点不规范。
基本上,这里发生的是,当ping
匹配时,随附的RewriteRules被视为一个新的“配置节”,将与出现指令的模块的上一个合并。
但是,mod_rewrite默认将以前的配置部分替换为新的部分。它们没有合并在一起。在RewriteOptions下有控制它的指令。
在三个不同的阶段对指令配置进行评估,合并和执行,这实际上是不直观的。在conf文件中,它们看起来就像是遇到的代码。