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
и просто исправил это с помощью текстового редактора.