2016-06-28 36 views
-1

请帮我找到这种行为的解决方案,这对我来说很陌生。mod_rewrite规则匹配,但链没有离开

这里是我的htaccess

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule  ^emltr\.gif$     aaa.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$       index.php [L,QSA] 
</IfModule> 

注意了L位,所以我要说的是,当“GIF”规则匹配时链条离开。 但事实并非如此。

请求的URL是“emltr.gif”

如果“包罗万象”的规则和条件注释,那么“GIF”规则正确服用。 (“aaa.html”不存在,这是一种防止不必要的循环行为的测试。)

如果“全面通过”规则未注释,则采用IT,而不是第一条规则。为什么第二个而不是第一个?否则:为什么不是即使L标志离开链条,然后评估第二条规则?

谢谢

+0

这就是L的工作原理,它会停止重写迭代。当规则匹配时,您可以使用END而不是L来立即结束重写过程 – starkeen

回答

1

这在手动L|last

的[L]标志导致mod_rewrite的停止处理规则集记录。 在大多数情况下,这意味着如果规则匹配,则不会处理更多规则。

如果您在.htaccess文件或<Directory>部分中使用RewriteRule,...简化的形式是,一旦处理了规则,重写的请求就会交还给URL解析引擎,以执行它可能会用它。有可能在处理重写的请求时,可能会再次遇到.htaccess文件或段,因此规则集可能会从头再次运行。最常见的情况是,如果其中一个规则导致重定向(无论是内部还是外部),则会导致请求过程重新开始。

替代标志[END]可用于终止当前一轮重写处理,但可防止在每个目录(htaccess)上下文中发生任何后续重写处理。这不适用于由外部重定向导致的新请求。

简而言之,当您在.htaccess文件或Directory指令中重写规则时,如果本轮重写请求,则会再次处理该请求。只有当没有更多的重写时,它才会停止。