Назад | Перейти на главную страницу

mod_rewrite для обслуживания статического файла на основе определенной строки запроса с помощью mod_proxy

Я хотел бы иметь обратный прокси (apache httpd с mod_proxy) перед IIS, на котором размещена веб-служба SOAP.

Проблема, с которой я столкнулся, заключается в том, что клиенты SOAP запрашивают у веб-сервера подробную информацию о веб-службе, загружая WSDL с конечной точки. Этот WSDL создается веб-службой и содержит URL-адреса веб-службы, которые должен использовать клиент. Проблема в том, что когда веб-служба находится за прокси-сервером, сгенерированные URL-адреса содержат неправильный частный адрес.

веб-служба IIS находится по адресу http://internal.host.com/Dirname/Service.asmx и его можно вызвать с помощью GET или POST.

WSDL извлекается с помощью GET с WSDL как строка запроса:

http://internal.host.com/Dirname/Service.asmx?WSDL

Обратный прокси-сервер представляет веб-службу как:

https://proxy.host.com/VirtualDir/Service.asmx

И моя проблема в том, что содержимое динамически сгенерированного WSDL содержит внутренние URL-адреса (к которым подключается прокси).

Я бы хотел избежать взлома / перекомпиляции самого веб-сервиса, поэтому, когда я думал об альтернативных решениях, я задавался вопросом;

Могу я сделать httpd на прокси-сервере каким-то образом перехватить вызов документа? WSDL и вместо этого обслуживать статический контент и по-прежнему перенаправлять другие запросы (включая параметры GET) на внутренний сервер IIS?

Соответствующая конфигурация httpd в настоящее время выглядит так:

ProxyPass "/VirtualDir/"  "http://internal.host.com/Dirname/"

И я подумал, что, возможно, RewriteCond и RewriteRule можно использовать каким-то умным способом, чтобы перехватывать только запросы к /.../Service.asmx?WSDL и вместо этого обслуживать статический локальный документ и пересылать «остальное» в IIS, но я действительно не знаю, как это сделать правильно, не нарушая ничего другого.

Обратный прокси-сервер также используется для других служб в других виртуальных «каталогах».

На данный момент я решил эту проблему, создав статическую спецификацию WSDL, содержащую правильные (проксированные) адреса для методов службы, и попросив клиентов использовать этот адрес.

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

Я установил статический файл на прокси-сервере apache http по этому адресу:

https://proxy.host.com/other_static_dir/Service.wsdl

Он содержит правильную спецификацию WSDL с общедоступными URI для использования. Я скачал его из IIS с помощью wget и просто исправил с помощью текстового редактора.