Apache 2.4:IF规则的优先顺序?

时间:2018-07-07 11:00:18

标签: apache2.4

我有.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进行任何建议的解释。

1 个答案:

答案 0 :(得分:1)

这看起来像是指令如何合并的另一种微妙行为,另一种行为是mod_rewrite有点不规范。

基本上,这里发生的是,当ping匹配时,随附的RewriteRules被视为一个新的“配置节”,将与出现指令的模块的上一个合并。

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

在三个不同的阶段对指令配置进行评估,合并和执行,这实际上是不直观的。在conf文件中,它们看起来就像是遇到的代码。