Внутренняя перезапись Apache2 из поддомена в подкаталог

Я пытаюсь внутренне переписать (не перенаправлять) весь трафик с 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]

Если вы используете для этого выделенный VHost, то зачем вообще переписывать - а не просто установить DocumentRoot в правильную папку для начала?

CBroe 15.03.2018 10:33

Это потому, что DocumentRoot такой же. Точка входа в приложение точно такая же.

NeverEndingQueue 15.03.2018 11:21

Значит, /api - это не реальный каталог, а просто выдуманный маршрут?

CBroe 15.03.2018 11:43

@Cbroe, это действительно маршрут. Одно из приведенных выше правил - переписать все маршруты в index.php, чтобы приложение могло обрабатывать маршрутизацию.

NeverEndingQueue 15.03.2018 12:02

Можете ли вы показать полную настройку перезаписи (хотя бы части, относящиеся к этому)? Если вы переписываете на /api/$1 внутри виртуального хоста api.domain.net, то, я думаю, задача перезаписи этого файла снова на какой-то index.php тоже должна была бы произойти. Если у вас прямо сейчас настроено перезапись запросов для domain.net, то внутренняя перезапись под другим виртуальным хостом никогда не дойдет до этого.

CBroe 15.03.2018 12:10

Я добавил к своему вопросу файл .htaccess. Есть некоторые правила, которые говорят: don't rewrite определенные вещи и пропускают другие правила (флаг L). Существует правило перенаправления http на https. Наконец, есть правило перезаписать все, кроме нескольких URL-адресов, на index.php. Это происходит на стороне кода. Я считаю, что как только нам удастся внутренне переписать весь трафик / на /api в API VHost, этот .htaccess не потребует изменений и будет одинаковым как для API-трафика, так и для не-API-трафика. Хотя я могу ошибаться.

NeverEndingQueue 15.03.2018 13:11
«После добавления я ожидал, что весь трафик [...] будет рассматриваться PHP как исходящий от https://local.domain.net/api/api_method, поэтому маршрутизируется правильно» - ну, это в первую очередь будет зависеть от того, к какому значению вы фактически обращаетесь в своем index.php, а затем в качестве основы вашей маршрутизации ... в зависимости от того, что именно вы вылавливаете из $ _SERVER (предположительно?), Это может не отражать текущий статус внутренней перезаписи, а только исходный URI запроса.
CBroe 15.03.2018 13:15

Моя маршрутизация основана на $_SERVER['REQUEST_URI'], и это тот, который я хотел бы изменить на стороне Apache2.

NeverEndingQueue 15.03.2018 15:55

Я не думаю, что это можно сделать с помощью внутреннего перенаправления. Это всегда будет то, что изначально запрашивалось клиентом - в противном случае вы не могли бы использовать его для своей маршрутизации таким образом, потому что вы всегда будете получать /index.php.

CBroe 15.03.2018 16:03

Это легко возможно с использованием NginX, и я помню, как делал это в прошлом: serverfault.com/questions/805881/… К сожалению, моя установка - Apache2, и я не хотел тратить время на переход на NginX ни по какой другой причине. Пока удалось настроить перезапись с флагами PT, L. В PHP я вижу ожидаемый перезаписанный URL с использованием $_SERVER['REDIRECT_URL'], но я все еще не удовлетворен. Вероятно, собираюсь модифицировать маршрутизатор, чтобы он мог обнаружить, что в начале api есть host, и добавить путь /api. Спасибо за помощь.

NeverEndingQueue 15.03.2018 19:12

Кстати, в Apache 2.4 есть ошибка. Сначала я играл с .htaccess, но его проигнорировали. Помогло добавление такого же перенаправления в VHost. Ссылка на ошибку: stackoverflow.com/questions/20023601/…

NeverEndingQueue 15.03.2018 19:14

Из решения nginx «$ request_uri имеет значение исходного URI, а $ uri - значение окончательного URI» - соответствует тому, что я имел в виду здесь относительно Apache, REQUEST_URI останется исходным значением, поэтому вам нужно будет найти любой эквивалент в Apache для этой переменной $uri. И хотя PT может работать для достижения желаемого, это больше, чем просто переписывание, с тем, что вы проксирование запрос от api.domain.net к domain.net/api внутри - так что, грубо говоря, для обработки каждого отдельного запроса заняты два процесса, а не один.

CBroe 15.03.2018 19:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
12
47
1

Ответы 1

<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 не должны видеть перенаправление.

NeverEndingQueue 15.03.2018 12:09

заменить [R=301,NC] на [R=301,P,NC]

Diogo Jesus 15.03.2018 12:12

подождите, неправильно понял, я обновлю ответ через 20 минут, извините за это

Diogo Jesus 15.03.2018 12:16

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