Здравствуйте. Имею приложение на Yii2 с шаблоном Advanced, которое включает в себя часть api.
Встал вопрос в том, как убрать часть /web/ из URL, т.е. чтобы URL были типа: site.com/api/controller/action.
В плане .htaccess использую решение с
wiki yii2.
Т.е. в кореневой папке:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
</IfModule>
<IfModule mod_rewrite.c>
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)
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 ^(.*)$ 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
</IfModule>
В остальные:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
URL Manager API:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => false,
'showScriptName' => false,
'rules' => [
'' => 'site/index',
'v1/order/status' => 'v1/order/status',
'test' => 'site/test',
],
],
Получается, при текущей конфигурации когда идет обращение:
site.loc/api это триггерится, как обращение к frontend. Получается, нужно сделать исключение, чтобы при переходе по ссылке
site.loc/api шло обращение к index.php его директории. Но как это реализовать? Сам около трех часов потратил на решение проблемы, документацию прочел, но либо конфигурировал какие-то аномалии(то отображался backend на api, то api на всех частях приложений), либо просто ронял конфигурации.
UPD:
Насколько я понял, именно в эту часть нужно вставить исключение, ибо здесь идет триггер по настройкам.
RewriteCond %{REQUEST_URI} ^/(assets|css|js|images)
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 ^(.*)$ frontend/web/$1 [L]
Т.е. нужно сделать исключение и ниже настройку, насколько понял:
RewriteCond %{REQUEST_URI} ^/api
RewriteRule ^.*$ api/web/index.php
UPD №2:
Мой последний вариант, но не отработал, правки отметил #:
RewriteCond %{REQUEST_URI} ^/(assets|css|js|images)
RewriteCond %{REQUEST_URI} !^(api) # добавляем исключение
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 ^(.*)$ frontend/web/$1 [L]
RewriteCond %{REQUEST_URI} ^/api #при запросе api
RewriteRule ^.*$ api/web/index.php # стучать в api/web/index.php