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 文件中,它们看起来就像遇到时将逐步执行的代码。
我有,按此顺序,.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 对 If
preceding authentication 的评论)。
任何建议的 TIA a/o 解释。
这看起来像是指令合并的另一种微妙行为,也是另一种 mod_rewrite 稍微不标准的行为。
基本上这里发生的事情是,当 <If>
匹配时,包含的 RewriteRules 被认为是一个新的 "configuration section" 将与前一个出现指令的模块合并。
但是,mod_rewrite默认情况下用新配置部分替换以前的配置部分。它们没有合并在一起。在 RewriteOptions 下有控制它的指令。
如何在三个不同的阶段评估、合并然后执行指令配置,这确实是不直观的。在 conf 文件中,它们看起来就像遇到时将逐步执行的代码。