Я пытаюсь внутренне переписать (не перенаправлять) весь трафик с api.domain.net на domain.net/api.
У меня есть один VHost, обслуживающий domain.net. Эта конечная точка поддерживает
Подкаталог /api как точка входа в API.
Я хотел бы настроить другую конечную точку api.domain.net, желательно в другом VHost, который будет обрабатывать трафик API. В этом случае я бы не хотел использовать подкаталог /api, поскольку домен подразумевает, что это API.
В моем проекте .htaccess уже используется для перезаписи всего трафика на index.php, поскольку все запросы маршрутизируются PHP. Правило: RewriteRule ^(.*)$ /index.php [L,END]
В идеале я хотел бы добавить новое правило перезаписи API в конфигурацию VHost, поскольку код (и .htaccess) должен быть одинаковым как для клиентов API, так и для клиентов, не относящихся к API.
Как лучше всего решить эту проблему?
Я пытался добавить правило (перед правилом index.php) в .htaccess просто для тестирования: RewriteRule ^(.*)$ /api/$1, но по какой-то причине оно ничего не делает.
После добавления я ожидал, что весь трафик, например: https://local.domain.net/api_method, будет рассматриваться PHP как исходящий от https://local.domain.net/api/api_method, поэтому маршрутизируется правильно.
РЕДАКТИРОВАТЬ.
.htaccess выглядит так (лишенный несвязанного материала):
RewriteEngine on
# Allow the Let's Encrypt cert verification
RewriteRule ^.well-known/ - [L,NC]
Options +FollowSymlinks
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^build/js/.*\.js$ - [NC,L]
# Run all non-file-asset requests through site entry point
RewriteCond %{REQUEST_URI} !^/resources/frontend/(images|swf|ttf) [NC]
RewriteRule ^(.*)$ /index.php [L,END]
Это потому, что DocumentRoot такой же. Точка входа в приложение точно такая же.
Значит, /api - это не реальный каталог, а просто выдуманный маршрут?
@Cbroe, это действительно маршрут. Одно из приведенных выше правил - переписать все маршруты в index.php, чтобы приложение могло обрабатывать маршрутизацию.
Можете ли вы показать полную настройку перезаписи (хотя бы части, относящиеся к этому)? Если вы переписываете на /api/$1 внутри виртуального хоста api.domain.net, то, я думаю, задача перезаписи этого файла снова на какой-то index.php тоже должна была бы произойти. Если у вас прямо сейчас настроено перезапись запросов для domain.net, то внутренняя перезапись под другим виртуальным хостом никогда не дойдет до этого.
Я добавил к своему вопросу файл .htaccess. Есть некоторые правила, которые говорят: don't rewrite определенные вещи и пропускают другие правила (флаг L). Существует правило перенаправления http на https. Наконец, есть правило перезаписать все, кроме нескольких URL-адресов, на index.php. Это происходит на стороне кода. Я считаю, что как только нам удастся внутренне переписать весь трафик / на /api в API VHost, этот .htaccess не потребует изменений и будет одинаковым как для API-трафика, так и для не-API-трафика. Хотя я могу ошибаться.
https://local.domain.net/api/api_method, поэтому маршрутизируется правильно» - ну, это в первую очередь будет зависеть от того, к какому значению вы фактически обращаетесь в своем index.php, а затем в качестве основы вашей маршрутизации ... в зависимости от того, что именно вы вылавливаете из $ _SERVER (предположительно?), Это может не отражать текущий статус внутренней перезаписи, а только исходный URI запроса.
Моя маршрутизация основана на $_SERVER['REQUEST_URI'], и это тот, который я хотел бы изменить на стороне Apache2.
Я не думаю, что это можно сделать с помощью внутреннего перенаправления. Это всегда будет то, что изначально запрашивалось клиентом - в противном случае вы не могли бы использовать его для своей маршрутизации таким образом, потому что вы всегда будете получать /index.php.
Это легко возможно с использованием NginX, и я помню, как делал это в прошлом: serverfault.com/questions/805881/… К сожалению, моя установка - Apache2, и я не хотел тратить время на переход на NginX ни по какой другой причине. Пока удалось настроить перезапись с флагами PT, L. В PHP я вижу ожидаемый перезаписанный URL с использованием $_SERVER['REDIRECT_URL'], но я все еще не удовлетворен. Вероятно, собираюсь модифицировать маршрутизатор, чтобы он мог обнаружить, что в начале api есть host, и добавить путь /api. Спасибо за помощь.
Кстати, в Apache 2.4 есть ошибка. Сначала я играл с .htaccess, но его проигнорировали. Помогло добавление такого же перенаправления в VHost. Ссылка на ошибку: stackoverflow.com/questions/20023601/…
Из решения nginx «$ request_uri имеет значение исходного URI, а $ uri - значение окончательного URI» - соответствует тому, что я имел в виду здесь относительно Apache, REQUEST_URI останется исходным значением, поэтому вам нужно будет найти любой эквивалент в Apache для этой переменной $uri. И хотя PT может работать для достижения желаемого, это больше, чем просто переписывание, с тем, что вы проксирование запрос от api.domain.net к domain.net/api внутри - так что, грубо говоря, для обработки каждого отдельного запроса заняты два процесса, а не один.






<VirtualHost *>
ServerName api.example.com
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI}/ api
RewriteRule ^(.*) http://www.example.com/%{REQUEST_URI} [R=301,NC]
</VirtualHost>
Это должно сделать это
Собственно, потребители API не должны видеть перенаправление.
заменить [R=301,NC] на [R=301,P,NC]
подождите, неправильно понял, я обновлю ответ через 20 минут, извините за это
Если вы используете для этого выделенный VHost, то зачем вообще переписывать - а не просто установить DocumentRoot в правильную папку для начала?