Yii2 advanced frontend и backend на одном домене.

Это повторение из Yiiframework WIKI. Просто для себя – надоело каждый раз вспоминать какая ссылка из поиска гугла ведет на нужную страницу.

Итак, имеем yii2 advanced project template с такой структурой:

/ <------------ это я называю корнем проекта
- backend
-- ...
-- web
- ...
- frontend
-- ...
-- web <------- сюда смотрт веб-сервер

Document root веб-сервера смотрит в frontend/web
Про начальную установку yii2 можно почитать в документации и я тоже уже писал раньше как установить yii2 advacned project template .

Нужно, чтобы по ссылке example.com/ открывался frontend,
а по ссылке example.com/backend открывался backend.

Путь первый

В папке frontend/web создается символьная сссылка на backend/web и называется backend.
Для этого находясь из корня проекта

cd frontend/web
ln -s ../../backend/web backend

Чтобы это сработало, нужно убедиться, что в настройках вебсервреа для хоста разрешены переходы по символьным ссылкам: в разделе Options для хоста должна быть опция +FollowSymlinks. Примерно так:

<VirtualHost *:80>
    ...
    Options +FollowSymlinks
    ...
</VirtualHost>

Все 🙂

Второй путь

Допустим нужно выложить advanced Yii2 проект на shared hosting.
Часто бывает, что нет доступа к ssh и через какую-нибудь cpanel симлинки не создать.
Можно конечно, попробовать через header-ы в index.php разрулить ситуацию, но пусть перенаправлением займется веб-сервер.
Я пока что дело имел только с apache, поэтому для nginx что-то смогу написать только как-нибудь позже.

Итак, пусть будет так:
Весь проект advanced помещается в корень сайта на shared хостинге.

Фронтенд работает по /
Бэкенд работает по /admin

1
Размещаем в файле frontend/config/main.php вот такой код:

    ...
    'homeUrl' => '/',
    ...
    'components' => [
        ...
        'request' => [
            'baseUrl' => ''
        ],
        ...
        'urlManager'=>[ //это по желанию
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
       ...
    ],

2
в файле backend/config/main.php вносим такие правки:

     ...
    'homeUrl' => '/admin',
     ...
    'components' => [
        ...
        'request'=>[
            'baseUrl'=>'/admin',
        ],
        ...
        'urlManager'=>[ //это - по желанию
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
    ],

3

Добавляем в корень проекта .htaccess с таким текстом:

RewriteEngine On

# rewrite for the frontend  - основной редирект в frontend/web
RewriteCond %{REQUEST_URI} !^/(backend/web|admin)
RewriteRule !^frontend/web /frontend/web%{REQUEST_URI} [L]

# rewrite for the backend - все что начинается с /admin редиректится в /backend/web
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^admin(.*) /backend/web/$1 [L]

# if under frontend/web file or directory exists - take it - если в frontend/web папка или файл существуют - берем их
RewriteCond %{REQUEST_URI} ^/frontend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward to index.php - все остальное отправляется на index.php во фронтенде (все что начинается с frontend/web)
RewriteRule . /frontend/web/index.php [L]

# same for backend - то же самое, но для бэкенда
RewriteCond %{REQUEST_URI} ^/backend/web
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /backend/web/index.php [L]

Проверено на паре шаредов.

Leave a Reply

Your email address will not be published. Required fields are marked *