.htaccess指令*不*redirect某些URL

在一个严重依赖.htaccess RewriteRules为其PrettyURL(在我的情况下是CakePHP)的应用程序中,我该如何正确设置指令以便从这个重写中排除某些目录? 那是:

 /appRoot/.htaccess app/ static/ 

默认情况下,对/appRoot/*每个请求都将被重写为由app/webroot/index.php提取,并在其中进行分析并调用相应的控制器操作。 这是通过.htaccess的这些指令完成的:

 RewriteBase /appRoot RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] 

我现在想排除像静态/这个重写几个目录。 我在Cake RewriteRules 之前尝试了这个:

 RewriteCond $1 ^(static|otherDir).*$ [NC] RewriteRule (.*) - [L] 

它到目前为止工作,请求不再被重写,但现在所有请求都被跳过,即使合法的Cake请求不应该匹配^(static|otherDir).*$

我尝试了这些规则的几个变体,但不能按照我想要的方式工作。

而正确的答案是…

 RewriteRule ^(a|bunch|of|old|directories).* - [NC,L] # all other requests will be forwarded to Cake RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] 

我仍然不明白,为什么最初调用根目录中的index.php文件,即使使用了这些指令。 它现在位于

 /appRoot/app/views/pages/home.ctp 

并通过Cake来处理。 现在,我想这样做也会起作用(Mike的建议略有改动,未经测试):

 RewriteCond $1 !^(a|bunch|of|old|directories).*$ [NC] RewriteRule ^(.*)$ app/webroot/$1 [L] 

你能不能把这个条件应用到下面的规则中,而是用否定的方式来处理(就其中的一些变化而言,我并不是很善于记住.htaccess规则,所以这些标志可能是错的):

 RewriteCond $1 !^(static|otherDir).*$ [NC] RewriteRule ^$ app/webroot/ [L] RewriteCond $1 !^(static|otherDir).*$ [NC] RewriteRule ^$ app/webroot/$1 [L] 

从以前的规则中删除[L]:

 RewriteBase /appRoot RewriteRule ^$ app/webroot/     RewriteRule (.*) app/webroot/$1 

[L]表示“停止重写过程,不要再应用任何重写规则”。