myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Как убрать default и index с помощью правил роутинга Yii?

Всем привет! Не могу никак до конца разобраться с правилами urlManager. Использую как контроллеры, так и модули. Пытаюсь убрать в контроллерах и модулях названия в адресной строке, которые имеют index, defaul и view. Пытаюсь убрать эти названия из адресной строки такими правилами:

'rules' => [
                //'/' => 'event/default/index',
                //'event/<id:\d+>' => 'event/view',
                '<_a:(login|signup|add-user)>' => 'site/<_a>',
                '<_c:[\w-]+>' => '<_c>/index',
                '<_c:[\w-]+>/<id:\d+>' => '<_c>/view',
                '<_c:[\w\-]+>/<_a:[\w-]+>' => '<_c>/<_a>',
                '<_m:[\w\-]+>' => '<_m>/default/index',
                '<_m:[\w\-]+>/<id:\d+>' => '<_m>/default/view',
                '<_m:[\w\-]+>/<id:\d+>/<c>' => '<_m>/default/<_a>',
                '<_m:[\w\-]+>/<_c:[\w\-]+>' => '<_m>/<_c>/index',
                '<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/view',
                '<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/<_a>',
                '<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',
            ]


При таких правилах у меня выдает ошибку 404 на модуле. Я так полагаю потому, что сначала идет правила для контроллера. Если его отключаю ('<_c:[\w-]+>' => '<_c>/index',), то модуль работает, а index страницы в контроллере перестают и выдают тоже 404.

Подскажите, как сделать? Так же буду благодарен если покажете где развернуто написано про правила в роутинге
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
Подробно про правила маршрутизации можно посмотреть здесь. Звук хромает, но понять можно.
Чтобы убрать из адресной строки index и defaul можно воспользоваться .htaccess.
На примере basic приложения это выглядит так:
В директории web .htaccess
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#RewriteCond %{REQUEST_URI} ^/web/*
RewriteRule . index.php

.htaccess в корне проекта
<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine on
</IfModule>

<IfModule mod_rewrite.c>
   RewriteCond %{REQUEST_URI} ^/.*
   RewriteRule ^(.*)$ web/$1 [L]

   RewriteCond %{REQUEST_URI} !^/web/
   RewriteCond %{REQUEST_FILENAME} !-f [OR]
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^.*$ web/index.php

</IfModule>

В настройках urlManager исключить из адреса файлы index 'showScriptName' => false,
Если проект находится в поддиректории локального сервера, например /home/user/localhost/www/project_name, то в настройках приложения надо указать параметр baseUrl
$baseUrl = str_replace('/web', '', (new Request)->getBaseUrl());
'request' => [
   'cookieValidationKey' => ADFAEk3o9dfhwleSDFo',
     'baseUrl' => $baseUrl,
  ],

Так, при помощи $baseUrl, Вы динамически задаёте название директории проекта. Можно её переименовывать, но при этом не надо будет редактировать файл конфигурации. Да и вообще, с этой настройкой можно перемещать файлы проекта и в поддиректорию и в корень.

Правила в urlManager могут выглядеть так:
'' => 'site/default/index',
'contact' => 'site/contact/index',
'<_a:(error)>' => 'site/default/<_a>',
// это правило для модуля users
'<_a:(login|logout|signup|password-rest-request|email-confirm|reset-password)>' => 'users/default/<_a>',
'<_m:[\w\-]+>' => '<_m>/default/index',
'<_m:[\w\-]+>/<_c:[\w\-]+>' => '<_m>/<_c>/index',
'<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',
'<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/view',
'<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',


Для advanced настройки .htaccess несколько другие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы