我正在开发一个位于子目录内的蛋糕应用程序(因为我需要与同一域上的另一个应用程序一起运行它)。我希望由 cake 提供支持的页面看起来就像是顶级的。
所以而不是example.com/cake_dir/page...
I want example.com/page...
我认为完成这项工作的最佳方法是向 .htaccess 文件添加重写规则,所以这就是我想知道的:
- 这是最好的方法吗?
如果是这样:
- 这种规则的正确语法是什么?
- 该文件应该去哪里?域根?在 cake_dir 中?或者在蛋糕的根目录中?
- 如果 Cake 的 .htaccess 文件之一已存在于该位置,则新规则应该在该位置之前还是之后,并且应该在该位置之前还是之后?
[L]
被删除吗?
更新:更清楚地描述我想要做什么
example.com/ <--root
/_cake <--CakePHP installed here
/page3
/page4
目前,访问者必须通过访问 example.com/_cake/page3 来访问第 3 页。这太糟糕了。相反,我想要这个:example.com/page3,如果 cake 路由到 example.com/_cake/page4,我希望它在浏览器中显示为 example.com/page4。
我一直在尽可能多地死记硬背 mod_rewrite 知识,我认为做到这一点的方法是进行内部重写,以在 _cake 不存在时显示正确的内容,并在 _cake 存在时进行外部重写。
Update这是现有的 .htaccess 文件...
/_cake 中的.htaccess...
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
.htaccess 在 /_cake/app...
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
.htaccess 在 /_cake/app/webroot...
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^(.*)$ index.php #[QSA,L]
RewriteRule ^(.*)$ index.php [QSA]
</IfModule>
Update 2我将 anubhava 的代码添加到根 .htaccess 文件中,然后还更新了 /_cake/ 处的 .htaccess 文件,如下所示(请注意,我必须删除 [L],以便 CakePHP 的正常重写仍然有效) :
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# external redirect from /_cake/page to /page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+_cake/([^\s]+) [NC]
RewriteRule ^ /%1 [R=302]
# internal forward from /page to /_cake/page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (?!^_cake/)^(.*)$ /_cake/$1 [NC]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>