为什么mod_rewrite会忽略我的[L]标志?

时间:2013-12-15 13:02:48

标签: apache mod-rewrite redirect web-applications assets

这是我的.htaccess文件。如果url匹配它,它应该从assets文件夹传递静态文件。否则,应将所有内容重定向到index.php

请注意,此处的网址不包含assets作为segemnt。因此example.com/css/style.css会指向assets/css/style.css

RewriteEngine on

# disable directory browsing
Options -Indexes

# static assets
RewriteCond %{DOCUMENT_ROOT}/assets/$1 -f
RewriteRule ^(.*)$ assets/$1 [L]

# other requests to index.php
RewriteRule !^asset/ index.php [L]

不幸的是,像example.com/assets/css/style.css这样的网址也提供了该文件,因为对于该网址,我的规则都不适用,并且应用了Apache的默认行为来传递文件。

所以我尝试将最后一行更改为此。我认为这样可行,因为上面规则中的[L]标志应该停止执行资产网址并传递它们。

RewriteRule ^(.*)$ index.php [L]

相反,并非所有请求都会重定向到index.php,甚至是example.com/css/style.css等静态资产。为什么标志不会停止执行重写规则以及谁来修复我的问题呢?

1 个答案:

答案 0 :(得分:0)

我在official documentation的页面上找到了解决方案。

  

如果您在.htaccess文件或中使用RewriteRule    部分,重要的是要有一些了解   如何处理规则。简化形式就是这一次   规则已经处理,重写的请求被交还给   URL解析引擎可以用它做它可能做的事情。它可能是   当处理重写的请求时,.htaccess文件或   可能会再次遇到该部分,因此可以运行规则集   从一开始。最常见的情况是,如果其中之一   规则导致重定向 - 内部或外部 - 导致   请求流程重新开始。

     

因此,如果您正在使用RewriteRule指令,那么这很重要   其中一个上下文,您采取明确的步骤来避免规则   循环,不仅仅依靠[L]标志来终止执行   一系列规则,如下所示。

     

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

要解决我的问题,我将[L]标记更改为[END]

RewriteEngine on

# disable directory browsing
Options -Indexes

# static assets
RewriteCond %{DOCUMENT_ROOT}/assets/$1 -f
RewriteRule ^(.*)$ assets/$1 [END]

# other requests to index.php
RewriteRule !^asset/ index.php [END]