[L]
标志无法工作的误解。我误解明显行为的原因以及给定问题的解决方案均在我的回答中描述。
设置
我在我的.htaccess文件中有以下代码:
# disallow directory indexing
Options -Indexes
# turn mod_rewrite on
Options +FollowSymlinks
RewriteEngine on
# allow access to robots file
RewriteRule ^robots.txt$ robots.txt [NC,L]
# mangle core request handler address
RewriteRule ^core/(\?.+)?$ core/handleCoreRequest.php$1 [NC,L]
# mangle web file adresses (move them to application root folder)
# application root folder serves as application GUI address
RewriteRule ^$ web/index.html [L]
# allow access to images
RewriteRule ^(images/.+\.(ico|png|bmp|jpg|gif))$ web/$1 [NC,L]
# allow access to stylesheets
RewriteRule ^(css/.+\.css)$ web/$1 [NC,L]
# allow access to javascript
RewriteRule ^(js/.+\.js)$ web/$1 [NC,L]
# allow access to library scripts, styles and images
RewriteRule ^(lib/js/.+\.js)$ web/$1 [NC,L]
RewriteRule ^(lib/css/.+\.css)$ web/$1 [NC,L]
RewriteRule ^(lib/(.+/)?images/.+\.(ico|png|bmp|jpg|gif))$ web/$1 [NC,L]
# redirect all other requests to application address
# RewriteRule ^(.*)$ /foo/ [R]
我的Web应用程序(以及其.htaccess文件)位于
DOCUMENT_ROOT
的foo
子文件夹中(通过浏览器访问为http://localhost/foo/
)。它的PHP核心部分位于foo/core
,JavaScript GUI部分位于foo/web
。正如上面的代码所示,我只想允许访问处理来自GUI的所有请求的单个核心脚本以及“安全”的Web文件,并将所有其他请求重定向到基本应用程序地址(最后一个注释的指令)。
问题
行为
它可以工作,直到我尝试取消注释最后一个重定向指令。 如果我注释掉更多行,则相应的页面部分停止工作等。
但是,当我取消注释最后一行时,这应该仅在所有先前规则匹配失败时执行(至少我是这样理解的),页面会进入重定向循环(Firefox会抛出错误页面,显示类似“此页面无法正确重定向”),因为它正在一遍又一遍地重定向到http://localhost/foo/
,而且永远不会停止。
问题
我不明白的是这个规则的处理方式:
RewriteRule ^$ web/index.html[L]
,
特别是[L]
标志。这个标志明显对我不起作用。 当最后一行被注释时,它可以正确地重定向,但是当我取消注释时,它总是被处理,尽管重写应该在[L]标志上停止。有人有什么想法吗?
此外,顺便说一下,我很高兴知道为什么我接下来尝试解决它的方法也不起作用:
RewriteEngine on
RewriteRule ^core/(\?.+)?$ core/handleCoreRequest.php$1 [NC,L]
RewriteRule ^(.*)$ web/$1 [L]
RewriteRule ^.*$ /foo/ [L]
这实际上根本不起作用。即使我删除最后一行,它仍然无法正确重定向任何内容。如果第一个示例中的重定向不起作用,那么重定向是如何工作的呢?
如果有人知道任何调试这些指令的方法,对我来说也会非常有益。我花了几个小时甚至没有最轻微的线索可以解决问题。
其他观察
在尝试bbadour给出的建议之后(并不是我以前没有尝试过,但现在我有了第二个意见,所以我又试了一次),它仍然没有起作用,我得出了以下观察结果。通过将最后一行重写为以下内容:
RewriteRule ^(.*)$ /foo/?uri=$1 [R,L]
或者这个
RewriteRule ^(.*)$ /foo/?uri=%{REQUEST_URI} [R,L]
通过使用Firebug的网络面板,我发现了更多证据,即[L]标志在先前提到的RewriteRule ^$ web/index.html [L]
规则(让我们称其为“THE RULE”)中明显未按预期工作。在第一种情况下,我得到了[...]uri=web/index.html
,在第二种情况下,我得到了[...]uri=/foo/web/index.html
。这意味着THE RULE被执行了(将^$重写为web/index.html),但重写并没有停止。还有更多的想法,请吗?