Настройте 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
, Это привело к бесконечным циклам, иначе мне пришлось бы использовать веб-клиент с URLmyproject.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/
,
Просто удалите дубликаты.