apache -.htaccess指令到*not*重定向某些URL

Translate

在高度依赖的应用程序中.htaccessRettyRules及其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]

到目前为止,它不再需要重写请求了,但是现在所有请求被跳过,即使合法的蛋糕请求也不匹配^(static|otherDir).*$.

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

正确的答案

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]
来源
Translate

您是否可以将条件不适用于以下规则,但要加上否定,例如:(有一些变化,我不太会记住.htaccess规则,因此标记可能是错误的):

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

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

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

RewriteBase /appRoot

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

[L]的意思是“在这里停止重写过程,并且不再应用任何重写规则。”

来源