mod_rewrite在[L]匹配后不会停止处理规则?

时间:2014-08-06 16:53:56

标签: apache .htaccess mod-rewrite

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^css/(.*)$ default/public/css/$1 [L]
RewriteRule ^js/(.*)$ default/public/js/$1 [L]
RewriteRule ^(.*)$ default/public/index.php?uri=$1 [L]
</IfModule>

这是我的.htaccess。 每当尝试访问http://domain.com/css/css.css时,我只获取default / public / index.php的内容。 如果我注释掉重定向到default / public / index.php?uri = $ 1的行,我得到default / public / css / css.css的内容,所以规则匹配,但[L]显然不是工作,因为它不会终止处理规则。

有人有同样的问题吗? 是一些服务器配置错误?关于如何解决这个问题的任何想法?

感谢任何建议!

2 个答案:

答案 0 :(得分:3)

  

但[L]显然无效

不,这不是正确的,L标志确实有效。 L处理不存在mod_rewrite标志的目的。 mod_rewrite规则在循环中运行,而L在编程方面与continue相同。

要解决此问题,您可以执行以下操作:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} .
RewriteRule ^ - [L]

RewriteRule ^css/(.*)$ default/public/css/$1 [L]
RewriteRule ^js/(.*)$ default/public/js/$1 [L]
RewriteRule ^(.*)$ default/public/index.php?uri=$1 [L]
</IfModule>

这里%{ENV:REDIRECT_STATUS}是Apache首次重写后设置的内部变量。

参考:Apache mod_rewrite Introduction

Apache mod_rewrite Technical Details

答案 1 :(得分:0)

我找到了我正在寻找的答案,显然Apache也通过这些规则传递了重写的URL,所以我不得不再添加两行,这样就解决了问题:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^css/(.*)$ default/public/css/$1 [L]
RewriteRule ^default/public/css/(.*)$ default/public/css/$1 [L]
RewriteRule ^js/(.*)$ default/public/js/$1 [L]
RewriteRule ^default/public/js/(.*)$ default/public/js/$1 [L]
RewriteRule ^(.*)$ default/public/index.php?uri=$1 [L]
</IfModule>