我正在自定义 Apache httpd (2.4.59) 的配置。这是一个谜题:
如果无条件则执行此规则:
RewriteRule ^/abc/.* /myscript.php [L]
但是如果这样编码,则规则不会执行:
<If true>
Header always set Test "executed"
RewriteRule ^/abc/.* /myscript.php [L]
</If>
测试标头已发送,但对于匹配 ^/abc/.* 的 URL,myscript.php 永远不会执行。
发生什么事了?
仅供参考,我正在以真实条件进行
<If>
,而不是<If true>
。但当我测试<If true>
时,我意识到 RewriteRule 无论如何都不会执行。
这是对 RewriteRule 的“修复” - 从模式中删除 ^:
<If true>
Header always set Test "executed"
RewriteRule /?abc/?.* /myscript.php [L]
</If>
解释
LogLevel alert rewrite:trace6
。<If>
块是最后处理的,在所有其他 RewriteRule 之后,包括那些位于 <If>
块下方的规则。 <If>
被记录为“[*perdir *If/]”(?)<If>
内的规则模式应用于每个传入 URL 的目标文件的绝对路径。<If>
内的模式可以包含绝对路径。