Apache 2.4:IF 规则的优先级?

Apache 2.4: Precedence of IF Rules?

我有,按此顺序,.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 帖子,我理解但不能将其应用到这里作为第一条规则,如果被解雇,应该重写 domain/host 因此不应该匹配 If 条件。

@covener 对 帖子的评论也提到了关于 variables/modules 的优先级,但是是否有更通用的文档? (我已经阅读了关于 TFM 中表达式的指令和参考文章,也注意到了关于 If preceding authentication 的评论)。

任何建议的 TIA a/o 解释。

这看起来像是指令合并的另一种微妙行为,也是另一种 mod_rewrite 稍微不标准的行为。

基本上这里发生的事情是,当 <If> 匹配时,包含的 RewriteRules 被认为是一个新的 "configuration section" 将与前一个出现指令的模块合并。

但是,mod_rewrite默认情况下用新配置部分替换以前的配置部分。它们没有合并在一起。在 RewriteOptions 下有控制它的指令。

如何在三个不同的阶段评估、合并然后执行指令配置,这确实是不直观的。在 conf 文件中,它们看起来就像遇到时将逐步执行的代码。