Как убрать web и настроить ЧПУ в Yii2?

В прошлой статье мы разобрали два варианта установки Yii2 на локальный сервер, в этом посте настроим ЧПУ и рассмотрим как избавиться от директории «web» в URL-адресах при обращении к страницам сайта для «basic» и «advanced» приложений.

После установки фреймворка главная страница сайта доступна по адресу http://yii2/web/yii2» это локальный домен, созданный в Open Server), но главная страница должна быть доступна по адресу http://yii2, то есть когда мы обращаемся к доменному имени, но пока при обращении к домену видим листинг файлов и папок.

Листинг папок и файлов при обращении к корню сайта

Почему так происходит? Потому что в директории «web» расположена общедоступная часть приложения, в ней находится входной файл index.php всего приложения, и в нее складываются все публичные файлы (стили, скрипты, картинки, шрифты и т.д.).

Необходимо убрать эту директорию из УРЛ-адресов, но сделать так, чтобы все запросы по-прежнему уходили в папку «web».

Для «basic»

Создаем два файла .htaccess: один файл в директории «web», другой в корне сайта.

В файле, созданном в папке «web», помещаем следующее:

RewriteBase /
# Если это папка или файл, открываем его
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# В противном случае перенаправляем на index.php
RewriteRule . index.php

Здесь все просто, если запрос не является папкой или файлом, тогда запрос перенаправляется на index.php.

В корневом .htaccess необходимо отправлять все запросы в папку «web», тут можно использовать два варианта. Первый короткий:

RewriteEngine on
RewriteRule ^(.+)?$ /web/$1

Такое перенаправление отлично работает на чистом Apache, а вот на хостингах, использующих связку Apache + Nginx, могут возникнуть проблемы, поэтому я рекомендую всегда использовать более развернутое правило перенаправления.

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule ^css/(.*)$ web/css/$1 [L]
RewriteRule ^fonts/(.*)$ web/fonts/$1 [L]
RewriteRule ^js/(.*)$ web/js/$1 [L]
RewriteRule ^images/(.*)$ web/images/$1 [L]
RewriteRule ^robots.txt web/robots.txt [L]
# Все что находится в папке web, что нужно показать
RewriteRule (.*) /web/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php

Для «advanced»

Создаем три файла .htaccess: первый в корне, второй в «frontend/web», третий в «backend/web».

В файлы, находящиеся в «backend/web» и «frontend/web», помещаем одинаковое уже знакомое правило:

# Если это папка или файл, открываем его
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# В противном случае перенаправляем на index.php
RewriteRule . index.php

В корневой .htaccess помещаем следующий код:

Options +FollowSymlinks
IndexIgnore */*
RewriteEngine On

RewriteCond %{REQUEST_URI} ^/(admin)
RewriteRule ^admin/assets/(.*)$ backend/web/assets/$1 [L]
RewriteRule ^admin/css/(.*)$ backend/web/css/$1 [L]

RewriteCond %{REQUEST_URI} !^/backend/web/(assets|css)/
RewriteCond %{REQUEST_URI} ^/(admin)
RewriteRule ^.*$ backend/web/index.php [L]

RewriteCond %{REQUEST_URI} ^/(assets|css|js|images|fonts|uploads|robots.txt)
RewriteRule ^assets/(.*)$ frontend/web/assets/$1 [L]
RewriteRule ^css/(.*)$ frontend/web/css/$1 [L]
RewriteRule ^js/(.*)$ frontend/web/js/$1 [L]
RewriteRule ^images/(.*)$ frontend/web/images/$1 [L]
RewriteRule ^fonts/(.*)$ frontend/web/fonts/$1 [L]
RewriteRule ^fonts/(.*)$ frontend/web/uploads/$1 [L]
RewriteRule ^robots.txt/(.*)$ frontend/web/robots.txt/$1 [L]
RewriteRule ^(.*)$ frontend/web/$1 [L]

RewriteCond %{REQUEST_URI} !^/(frontend|backend)/web/(assets|css|js)/
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ frontend/web/index.php

Принцип такой же, как и для «basic», просто отдельно прописываем правила для «frontend» и «backend», а все запросы на публичные файлы отправляем на «frontend».

Настройка ЧПУ в Yii2 приложениях

Из коробки в фреймворке ЧПУ выключены, чтобы их включить для «basic» необходимо открыть файл web.php, который находится в папке «config», в массиве «components» находим вложенный массив «request» и вставляем следующую настройку:

'baseUrl' => '',

Должно получиться так, как показано на скриншоте ниже.

Вставляем пустой baseUrl в массив request

В том же массиве «components» находим и раскомментируем следующий код:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
    ],
],

Если данный код отсутствует, то просто вставляем его в массив «components» и сохраняем файл.

Для «advanced» нужно проделать тоже самое в файле main.php, который находится в папке «frontend/config». В следующей статье рассмотрим роутинг и генерацию ссылок в Yii2. На этом статью буду заканчивать, если что-то не понятно, пишите в комментариях.

Похожие записи:

Добавить комментарийОтменить ответ

Нажимая на кнопку «Добавить», я даю согласие на обработку своих персональных данных в соответствии с политикой конфиденциальности