@MarkLb

Как настроить .httaccess для api части приложения?

Здравствуйте. Имею приложение на 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
  • Вопрос задан
  • 410 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Попробуйте в .htaccess правила для api поставить перед правилами для frontend и чуть изменить
RewriteCond %{REQUEST_URI} ^/(api)
RewriteRule ^api(/.*)?$ api/web/$1 [L]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы