在一个严重依赖.htaccess RewriteRules for 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).*$

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

===============>>#1 票数:6 已采纳

而正确的答案是...

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]

===============>>#2 票数:1

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

RewriteBase /appRoot

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

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

===============>>#3 票数:1

您是否可以将条件应用于以下规则,但是否定,如(在某些变体中,我不太擅长记住.htaccess规则,因此标志可能是错误的):

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

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

  ask by deceze translate from so

未解决问题?本站智能推荐: