Как прокси-запросы на локальный хост к нелокальному URL

641
Xgongiveittoya

Я настраиваю локальную среду для тестирования с использованием WAMP.

Приложение (угловое приложение) находится в каталоге / wamp / www / app /. Он отправляет запросы другому API, отправляя запросы другому маршруту на том же сервере. (Специально для / wamp / www / api / route)

У нас есть сервер dev api, который существует на http://api.com . У нас есть еще один тестовый экземпляр углового приложения по адресу http://testapp.com/app/, который может отправлять запросы на http://api.com, указывая на http://testapp.com/api/route .

Способ, которым это работает в тестовом экземпляре (не локальном), заключается в том, что у нас есть файл .htaccess по адресу http://testapp.com/api/route, который принимает запросы на http://testapp.com/api/route/ * и отправляет их на http://api.com/ *

Файл .htaccess, который делает это, выглядит следующим образом:

<IfModule mod_rewrite.c> RewriteRule (.*) http://api.com/$1 [NC,P] </IfModule> 

Когда я копирую этот файл .htaccess в мой каталог / wamp / www / api / route /, я ожидаю следующее поведение:

Что я хочу

Приложение отправит запрос в / wamp / www / api / route / stuff /, а файл .htaccess в / route / примет этот запрос и перенаправит его на http://api.com/stuff.

Что я получаю

Приложение отправит запрос в / wamp / www / api / route / stuff / и вернет 404.

Я убедился, что AllowOverride all установлен, что механизм перезаписи включен, и что mod-rewrite включен. Я знаю, что файл .htaccess просматривается, потому что, если я добавлю в него мусор, я получу 500 вместо 404, и мой мусор попадет в журнал.

Любая помощь приветствуется! Благодарю.


После получения помощи от Purefan я включил ведение журнала перезаписи, и после включения не было попыток перезаписи, что указывало бы на то, что правило перезаписи никогда не выполняется для запросов.

Теперь я попытался изменить порядок вызова правила перезаписи.

Я создал каталог в файле конфигурации httpd следующим образом:

<Directory "c:/wamp64/www/api/route"> Options +FollowSymLinks RewriteEngine on <IfModule mod_rewrite.c> RewriteRule (.*) http://api.com/$1 [NC,P] </IfModule> </Directory> 

И я все еще получаю такое же поведение

1
Помните, что вы переписываете запрос, основываясь на URI, а не на папках. Когда apache получает запрос, он сопоставляет его с набором правил в блоках VirtualHost, если запрос соответствует одному из блоков VirtualHost, то правила в этом блоке обрабатывают запрос. Когда приложение отправляет запрос `localhost`, возможно, блок с DocumentRoot` / wamp / www / api / route / stuff` перехватывает его, но, возможно, это не так. Проверьте свои журналы доступа, установите один другой для VirtualHost, чтобы сделать его проще Purefan 7 лет назад 1
Вы также можете включить [переписать журнал] (http://httpd.apache.org/docs/current/mod/mod_rewrite.html), чтобы помочь вам увидеть, что переписывается и как Purefan 7 лет назад 1
Переписать журнал звучит полезно. Я посмотрю на это и вернусь. Спасибо! Xgongiveittoya 7 лет назад 0
Запрос отправляется в правильное место, как это может показаться, но при входе в систему перезаписи, кажется, ничего не переписывается. [03 / Feb / 2017: 11: 02: 01 -0500] "GET / api / route / stuff Xgongiveittoya 7 лет назад 0

1 ответ на вопрос

1
Xgongiveittoya

Благодаря Purefan, с включенным журналом перезаписи, я увидел, что перезапись пыталась переписать, но затем запрос так и не был отправлен.

Когда я удалил флаг P из RewriteRule, он переписал бы запрос, но тогда мои заголовки не были добавлены, потому что мы не проксировали, что мне нужно сделать.

Это тогда привело меня к пониманию, что прокси-сервер не работал правильно, что сразу же привело к такому решению:

В файле httpd.conf измените

#LoadModule proxy_module modules/mod_proxy.so 

в

LoadModule proxy_module modules/mod_proxy.so 

TL; DR

Включите mod_proxy, если вы хотите использовать прокси с флагом P в правиле перезаписи

Похожие вопросы