Настройте 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, Это привело к бесконечным циклам, иначе мне пришлось бы использовать веб-клиент с URL myproject.host.loc/webclient/public...
  • С или без RewriteBase, Похоже, это тоже игнорируется. Ничего не меняет
  • Добавляется или удаляется каждый трейлинг / в любой возможной комбинации. (Я был в отчаянии)

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

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

1 ответ

Это кажется проблемой:

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

Помни что RewriteBase зависит от состояния в RewriteRule, Итак, вы попросили переписать URL, которые начинаются с /api/v1/api/v1/,

Просто удалите дубликаты.

Другие вопросы по тегам