22

在一个严重依赖.htaccessRewriteRules 的 PrettyURLs(在我的例子中是 CakePHP)的应用程序中,我如何正确设置指令以从重写中排除某些目录?那是:

/appRoot/.htaccess
         app/
         static/

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

RewriteBase /appRoot

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

我现在想从这个重写中排除一些像 static/ 这样的目录。我在 Cake RewriteRules之前试过这个:

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

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

我尝试了这些规则的几种变体,但无法让它按我想要的方式工作。

4

3 回答 3

6

而正确的答案 iii...

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 处理。现在有了这个,我想这也会奏效(迈克建议的略微修改版本,未经测试):

RewriteCond $1      !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$  app/webroot/$1 [L]
于 2008-08-07T06:09:54.337 回答
1

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

RewriteBase /appRoot

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

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

于 2008-08-06T08:19:29.677 回答
1

您能否不将条件应用于以下规则,而是使用否定,如(有一些变化,我不太擅长记住 .htaccess 规则,所以标志可能是错误的):

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

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]
于 2008-08-06T08:26:56.667 回答