Arhn - архитектура программирования

Как сделать, чтобы CakePHP 2.x в подкаталоге отображался в корне (с mod_rewrite в htaccess)?

Я работаю над приложением для торта, которое находится внутри подкаталога (потому что мне нужно запустить его вместе с другим приложением в том же домене). Я хочу, чтобы страницы, работающие на торте, выглядели так, как если бы они были верхнего уровня.

Поэтому вместо example.com/cake_dir/page... я хочу example.com/page...

Я думаю, что лучший способ заставить это работать — добавить правило перезаписи в файл .htaccess, поэтому вот что я хочу знать:

  1. Это лучший способ сделать это? Если так:
  2. Каков правильный синтаксис для такого правила?
  3. Куда должен идти этот файл? Корень домена? В Cake_Dir? Или в корне торта?
  4. Если один из файлов 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>

Ответы:


1

$DOCUMENT_ROOT/.htaccess:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

# internal forward from /page to /_cake/page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (?!^_cake/)^(.*)$ /_cake/$1 [L,NC]

$DOCUMENT_ROOT/_cake/.htaccess:

RewriteEngine on
RewriteBase /_cake/
RewriteRule (.*) app/webroot/$1 [L]

$DOCUMENT_ROOT/_cake/app/.htaccess:

RewriteEngine on
RewriteBase /_cake/app/
RewriteRule (.*) webroot/$1 [L]

$DOCUMENT_ROOT/_cake/app/webroot/.htaccess:

RewriteEngine On
RewriteBase /_cake/app/webroot/

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+_cake/([^\s&]*) [NC]
RewriteRule ^ /%1 [R=302,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
09.04.2013
  • Спасибо, но я все еще вижу _cake в URL. Должен ли он быть удален? 09.04.2013
  • Да. Cake помещает файл .htacces в _cake, а также в _cake/app/webroot. Они применяются, потому что внешняя перезапись указывает на тот же домен? 09.04.2013
  • Я собираюсь добавить каждый файл .htaccess к вопросу... 09.04.2013
  • Вы имеете в виду переименовать каталог? Или изменить _cake в вашем коде? 09.04.2013
  • Я выполнил поиск/замену вашего кода, и он ДЕЙСТВИТЕЛЬНО меняет URL-адреса, содержащие /_sample/page, на /page. Означает ли это, что .htaccess CakePHP все портит? 09.04.2013
  • АГА! Я добавил слегка измененную версию вашего кода в /_cake/, и он начинает работать, как и ожидалось (см. мое обновление2 выше). 09.04.2013
  • Кажется, все работает отлично. Единственная оставшаяся проблема заключается в том, что на моей домашней странице торта по-прежнему отображается /_cake/ (example.com/_cake/) 09.04.2013
  • Теперь правило соответствует example.com/_cake/, но оно перенаправляет на /, и я получаю ошибку 404 запрещен. 09.04.2013
  • Нет. Этот каталог в настоящее время пуст, кроме моих каталогов _cake и _wp. Кроме того, мне нужно исправить тот факт, что наши новые правила заставляют CakePHP искать файлы /js/... и /css/... в неправильном месте. Мое понимание всего, что мы делаем, шатко, но я думаю, что нам нужно создать правила, чтобы найти те каталоги, где они на самом деле живут (в _cake/app/webroot/) 09.04.2013
  • example.com/_cake/ теперь называется example.com/ ! Я думаю, что единственная оставшаяся проблема — это каталоги /css/ и /js/. 09.04.2013
  • Это то, что CakePHP ищет <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
  • Это не сработало. Кроме того, я заметил, что теперь я получаю ошибку цикла перенаправления в корне документа. 09.04.2013
  • Вы можете поболтать минутку? 09.04.2013
  • давайте продолжим это обсуждение в чате 09.04.2013
  • Привет, получаю 404 после применения этого правила!!! пожалуйста помоги 28.08.2018
  • @ mamun0024: Пожалуйста, откройте новый вопрос со всеми подробностями, так как это очень старый ответ. 28.08.2018

  • 2

    Если вы хотите, чтобы когда кто-то запрашивает http://example.com/page, он фактически получал контент, предоставленный /cake_dir/page, вам следует добавить эти правила в файл htaccess в корне вашего документа (или «корне домена»):

    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/cake_dir%{REQUEST_URI} -f
    RewriteRule ^(.*)$ /cake_dir/$1 [L]
    

    URL-адрес в адресной строке браузера останется неизменным, так как отсутствует внешнее перенаправление. Условие здесь состоит в том, что он проверяет, указывает ли %{DOCUMENT_ROOT}/cake_dir%{REQUEST_URI} на файл. Эта строка, по сути, объединяет корень документа, затем строку «cake_dir», а затем собственно запрошенный файл. В случае, если ни один из этих запросов на самом деле не указывает на физические файлы в «cake_dir», вы можете попробовать:

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /cake_dir/$1 [L]
    

    Здесь условия таковы, что запрошенный URI (например, /page) не указывает на существующий файл или каталог. И он слепо направляет все в каталог /cake_dir.


    Чтобы перенаправить браузер в случае, если кто-то нажмет на ссылку с cake_dir, вам понадобятся следующие правила:

    RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /cake_dir/
    RewriteRule ^cake_dir/(.*)$ /$1 [L,R=301]
    
    08.04.2013
  • ДА!!!!! Это сработало после добавления второго блока кода. У меня сейчас они оба. Это правильно? Кроме того, есть ли способ сделать так, чтобы ссылки внутри торта не добавляли /cake_dir/ обратно в URL-адрес? Может редирект? 09.04.2013
  • @Emerson Вам нужно только одно или другое, это зависит только от того, какое условие вы хотите, действительно ли запрошенный URI существует в cake_dir (первый) или запрос не соответствует какому-либо физическому файлу или каталогу (второй). 09.04.2013
  • Не совсем понял последнее. Можно ли сделать так, чтобы cake_dir никогда не появлялся (даже в оригинале? 09.04.2013
  • Я близок к тому, чтобы заставить это работать, но это еще не совсем правильно. Я хочу, чтобы на example.com/cakepage отображался контент с example.com/cake_dir/cakepage, а весь трафик на example.com/cake_dir/page отображался как example.com/page. Я думаю, что последний требует внешней перезаписи, но я не могу заставить его работать. 09.04.2013
  • Я обновил вопрос с более четким описанием. 09.04.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..