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, но я не знаю, как правильно это сделать, не нарушая ничего другого.

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

1 ответ

Решение

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

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

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

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

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

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