.htaccess在比赛结束后继续重写


.htaccess rewrite keeps going after a match is made

我将以htaccess和mod_rewrite不是我的最佳领域为序。我写了一个phpMVC框架供个人使用,在文档根目录中,我有一个名为"public"的文件夹,用于css、js、image等。每个HTTP请求都会根据"public"中的文件进行检查,如果存在,它会发送该文件;否则,它将重定向到框架的index.php。

规则是有效的,但如果在"public"中匹配,它仍然会路由到index.php。如果我注释掉重定向到index.php的最后一行,css和js就会正确加载。在"公开"比赛结束后,我无法让它停止处理。

提前感谢

Options +FollowSymLinks
RewriteEngine On
#If file exists as public resource
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/public/$1 [NC,L]

#Redirect everything else to index.php
RewriteRule ^(.*) index.php [NC,L]

您需要添加一个测试来查看请求是否已经指向公共目录,如果没有,则只触发RewriteRule:

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^.*$ index.php

请注意,[L]("最后一个")标志经常被误解。它会停止在当前过程中进一步测试和修改的请求,但它无法阻止Apache从一开始就通过整个规则集运行新修改的请求(这是因为.htaccess规则从顶部应用于每个新的或修改的请求)。因此,您需要添加RewriteCond指令来检查您是否正在处理在规则集的上一次传递中指向公用文件夹的请求。

有关更多详细信息,请参阅Apache 2.4文档中的"last"标志。[注意,Apache 2.4提供了[END]标志,该标志将停止对请求进行另一次重写处理,但这个新标志在Apache 2.2及更早版本中不可用。]

看起来你在做一些不必要的检查,而且每次执行重写时都会触发新的规则传递。

也许试试这样的东西?

RewriteEngine On
# pass through anything in the domain.com/public directory
RewriteRule ^/public/(.*)$ - [NC,L]
# route everything else to index
RewriteRule ^(.*)$ index.php [NC,L]

它应该在第一次通过公共目录中的任何内容,其他内容都需要两次通过才能满足第二条规则AFAIK。我认为主要的技巧是提供一条不会触发重写的路线,这样你就不会触发第二次通过

也要记住,括号并不是真正必要的,除非你打算用它们的内容重写为$1,$2,。。。