Я работаю над приложением для торта, которое находится внутри подкаталога (потому что мне нужно запустить его вместе с другим приложением в том же домене). Я хочу, чтобы страницы, работающие на торте, выглядели так, как если бы они были верхнего уровня.
Поэтому вместо example.com/cake_dir/page...
я хочу example.com/page...
Я думаю, что лучший способ заставить это работать — добавить правило перезаписи в файл .htaccess, поэтому вот что я хочу знать:
- Это лучший способ сделать это? Если так:
- Каков правильный синтаксис для такого правила?
- Куда должен идти этот файл? Корень домена? В Cake_Dir? Или в корне торта?
- Если один из файлов Cake .htaccess уже существует в этом месте, должно ли новое правило идти до или после, и должны ли быть удалены
[L]
?
ОБНОВЛЕНИЕ: более четкое описание того, что я пытаюсь сделать
example.com/ <--root
/_cake <--CakePHP installed here
/page3
/page4
В настоящее время посетители должны получить доступ к странице 3, перейдя по адресу example.com/_cake/page3. Это отстой. Вместо этого я хочу это: example.com/page3, и если торт ведет на 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>
.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, а затем также обновил файл .htaccess в /_cake/, чтобы он выглядел следующим образом (обратите внимание, что мне пришлось удалить [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>
/_cake/
, и он начинает работать, как и ожидалось (см. мое обновление2 выше). 09.04.2013<link rel="stylesheet" type="text/css" href="/_cake/css/cake.generic.css" />
и<script type="text/javascript" src="/_cake/js/jquery.min.js"></script>
09.04.2013