Настройка ЧПУ в Yii2
Думаю, никому уже не нужно объяснять, что такое ЧПУ. Фактически красивые адреса (ЧПУ) уже стали стандартом в веб-разработке и уже сложно отыскать сайт в сети, который бы использовал адреса с явными GET параметрами. Практически все сайты сейчас могут похвастать красивыми адресами.
Фреймворк Yii2 из коробки не имеет настроенных ЧПУ, но исправить это крайне легко. Как вы помните, по умолчанию сразу после установки фреймворка для доступа к главной странице нам необходимо обратиться к папке web, в которой и лежит публичная часть Yii приложения. Т.е. для доступа к главной странице мы должны были набрать адрес http://yii2/web/.
От папки web мы смогли легко избавиться с помощью файлов .htaccess.
Для «basic»
Создаем два файла .htaccess
: один файл в директории «web», другой в корне сайта.
В файле, созданном в папке «web», помещаем следующее:
1 2 3 4 5 6 | RewriteBase / # Если это папка или файл, открываем его RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # В противном случае перенаправляем на index.php RewriteRule . index.php |
Здесь все просто, если запрос не является папкой или файлом, тогда запрос перенаправляется на index.php
.
В корневом .htaccess
необходимо отправлять все запросы в папку «web», тут можно использовать два варианта. Первый короткий:
1 2 | RewriteEngine on RewriteRule ^(.+)?$ /web/$1 |
Такое перенаправление отлично работает на чистом Apache, а вот на хостингах, использующих связку Apache + Nginx, могут возникнуть проблемы, поэтому я рекомендую всегда использовать более развернутое правило перенаправления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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», помещаем одинаковое уже знакомое правило:
1 2 3 4 5 | # Если это папка или файл, открываем его RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # В противном случае перенаправляем на index.php RewriteRule . index.php |
В корневой .htaccess
помещаем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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» и вставляем следующую настройку:
1 | 'baseUrl' => '', |
Должно получиться так, как показано на скриншоте ниже.
В том же массиве «components» находим и рас комментируем следующий код:
1 2 3 4 5 6 | 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], |
Если данный код отсутствует, то просто вставляем его в массив «components» и сохраняем файл.
Для «advanced» нужно проделать тоже самое в файле main.php
, который находится в папке «frontend/config», а в main.php
, папки «backend/config», нужно еще изменить baseUrl
:
1 | 'baseUrl' => '/admin' |