Назад | Перейти на главную страницу

Настройте Apache для перезаписи вызовов API

У меня есть проект, состоящий из двух частей. Во-первых, API, где обрабатываются все запросы данных. Во-вторых, веб-клиент, чтобы пользователи могли удобно использовать инструмент. Поэтому веб-клиент просто выполняет вызовы API.

Структура проекта следующая:

/var/www
    /myproject
        /api
            /v1
                Controller.php /* this is the API v1 controller */
        /webclient
            /views /* just some templates ... */
            /public /* all public stuff, like css, html, images, ... */
                index.php /* index file for web client */

Я настроил Apache, чтобы /var/www/myproject/webclient/public как корень документа, и у меня был Alias так что звонит myproject.host.loc/api/v1/Controller.php?<much-params> будет перенаправлен на /var/www/myproject/api/v1.

Теперь я хотел иметь более «красивые» вызовы API, например:

myproject.host.loc/api/v1/add-item?name=fubar&api-key=4234&token=6344

Вместо того:

myproject.host.loc/api/v1/Controller.php?request=add-item&name=fubar&api-key=4234&token=6344

Поэтому я хотел отобразить каждый URI, который запрашивает /api/v1 к Controller.php и пусть сценарий сделает все остальное. Мне не нужны другие ресурсы или скрипты в /var/www/myproject/api/v1 для прямого доступа.

Я попытался сделать это со следующим виртуальным хостом Apache:

<VirtualHost *:80>

    DocumentRoot /var/www/myproject/webclient/public
    ServerName myproject.host.loc

    Alias /api/v1 /var/www/myproject/api/v1
    <Directory /var/www/myproject/api/v1>
        RewriteBase    /api/v1/
        RewriteEngine  On
        RewriteCond    %{REQUEST_FILENAME} !-f
        RewriteCond    %{REQUEST_FILENAME} !-d
        RewriteRule    api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]
    </Directory>

</VirtualHost>

Веб-клиент появляется, но предполагаемый способ вызова API не работает. Если я открою myproject.host.loc/api/v1 в браузере он просто показывает мне Index of /api/v1, содержащий каждый файл. Похоже, что правило перезаписи полностью игнорируется. Я также могу получить доступ к API «старым» способом, но хочу заменить его новым, «красивее» вызовом. (Также по соображениям безопасности, так что только контроллер может быть вызван извне)

Как я могу этого добиться? Я пробовал несколько способов сделать это, в том числе:

В поисках решения я нашел ресурс, где кто-то говорит, что вы не можете использовать Alias с участием Rewrite, но я также встречал людей, говорящих, что это возможно ... Сейчас я совершенно запутался.

Я надеюсь, что кто-нибудь сможет мне с этим помочь

Похоже, это проблема:

        RewriteBase    /api/v1/
        RewriteRule    api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]

Помни это RewriteBase добавляется к условию в RewriteRule. Итак, вы попросили переписать URL-адреса, начинающиеся с /api/v1/api/v1/.

Просто удалите дублирование.