我正在开发一个位于子目录中的蛋糕应用程序(因为我需要在同一域上的另一个应用程序旁边运行它)。我希望由 cake 提供支持的页面看起来好像它们是顶级的。
所以不是example.com/cake_dir/page...
我想要example.com/page...
我认为完成这项工作的最佳方法是向 .htaccess 文件添加重写规则,所以这就是我想知道的:
- 这是最好的方法吗?如果是这样的话:
- 这种规则的正确语法是什么?
- 那个文件应该去哪里?域根?在 cake_dir 中?还是在蛋糕的根目录中?
- 如果 Cake 的 .htaccess 文件之一已经存在于该位置,那么新规则应该在之前还是之后进行,并且应该
[L]
删除 s 的 和 ?
更新:更清楚地描述我正在尝试做的事情
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 存在时进行外部重写。
更新 这里是现有的 .htaccess 文件...
.htaccess 在 /_cake...
<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>
/_cake/app/webroot 中的.htaccess ...
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^(.*)$ index.php #[QSA,L]
RewriteRule ^(.*)$ index.php [QSA]
</IfModule>
更新 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>