У меня есть проект, состоящий из двух частей. Во-первых, 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
, но я также встречал людей, говорящих, что это возможно ... Сейчас я совершенно запутался.
Я надеюсь, что кто-нибудь сможет мне с этим помочь
Похоже, это проблема:
RewriteBase /api/v1/
RewriteRule api/v1/(.*)$ api/v1/Controller.php?request=$1 [QSA,NC,L]
Помни это RewriteBase
добавляется к условию в RewriteRule
. Итак, вы попросили переписать URL-адреса, начинающиеся с /api/v1/api/v1/
.
Просто удалите дублирование.