【发布时间】:2013-03-29 22:52:12
【问题描述】:
我正在开发一个位于子目录内的蛋糕应用程序(因为我需要在同一个域中的另一个应用程序旁边运行它)。我希望由 cake 提供支持的页面看起来好像它们是顶级的。
所以我想要example.com/page...而不是example.com/cake_dir/page...
我认为完成这项工作的最佳方法是向 .htaccess 文件添加重写规则,所以这是我想知道的:
- 这是最好的方法吗? 如果是这样:
- 这种规则的正确语法是什么?
- 该文件应该放在哪里?域根?在 cake_dir 中?还是在 cake 的 webroot 中?
- 如果 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 in /_cake...
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
.htaccess in /_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>
更新 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>
【问题讨论】:
标签: apache .htaccess cakephp mod-rewrite cakephp-2.0