解析.htaccess多少次并运行RewriteRule指令?

时间:2011-09-15 01:42:03

标签: apache .htaccess mod-rewrite

这是一个微不足道的问题,但我想仔细检查。

以下.htaccess的次数是多少次?

RewriteRule ^.*$ bla [L]
RewriteRule bla foo [L]

我理解[L]停止为文件的其余部分执行RewriteRule,但是它会重新开始吗?

这可能看起来像一个愚蠢的问题,所以我提前道歉,但由于我写作RewriteRule的经验非常有限,我觉得.htaccess文件有时被解析得更多不止一次。

2 个答案:

答案 0 :(得分:3)

是的,L标志不会像您认为的那样在该示例中起作用。由于.htaccess文件位于“每个目录”上下文中,因此mod_rewrite会创建一个子请求进程。该过程将保持处理规则,直到它不再处理为止,或者在您的示例中以L标志中断它。

但是,由于重写是通过规则#1触发的,因此重写引擎将创建一个新的子请求并再次执行.htaccess规则。只要重写发生,它就会重复此过程,并且只在没有重写时才进行处理。

在你的例子中,L标志不仅没有做你想要的事情,它们实际上是通过要求apache创建多个子请求而不是使用处理这两个规则然后完成的单个子请求来减慢速度。

答案 1 :(得分:0)

它对输入“ bla”进行了一次处理,对所有其他输入进行了两次处理,因为成功地更改内部URL的重写将在处理整个.htaccess之后导致内部重定向。请注意,永远不会处理第二个RewriteRule,可能是因为总是触发第一个规则。

如果要使其循环,可以在第一个规则前加上RewriteCond %{REQUEST_URI} !bla或交换两个规则的顺序。然后,.htaccess文件将被处理11次(如果您没有为LimitInternalRecursion设置其他值,则默认最多重定向10次),然后将发出500 Internal Server Error。

您可以通过在httpd.conf中设置LogLevel rewrite:trace2或更高版本并查看错误来查看其工作情况。