这是我的.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
等静态资产。为什么标志不会停止执行重写规则以及谁来修复我的问题呢?
答案 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]