在一个严重依赖.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]
我现在想从这次重写中排除一些像static/这样的目录。在蛋糕RewriteRules之前,我尝试过这个:
RewriteCond $1 ^(static|otherDir).*$ [NC]
RewriteRule (.*) - [L]
到目前为止,请求不再被重写,但现在所有的请求都被跳过了,甚至不应该与^(static|otherDir).*$
匹配的合法的请求也是如此。
我尝试了这些规则的几个变体,但无法让它以我想要的方式工作。
发布于 2008-08-07 06:09:54
正确的答案是…
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]
发布于 2008-08-06 08:19:30
从前面的规则中删除L:
RewriteBase /appRoot
RewriteRule ^$ app/webroot/
RewriteRule (.*) app/webroot/$1
L的意思是“在这里停止重写过程,不再应用任何重写规则。”
发布于 2008-08-06 08:26:57
您可以不将条件应用于以下规则,但使用否定,如(由于其一些变体,我不太擅长记住.htaccess规则,因此标志可能是错误的):
RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/ [L]
RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]
https://stackoverflow.com/questions/3157
复制相似问题