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

Сохранить исходный URL-адрес запроса при перенаправлении mod_proxy

Я запускаю веб-приложение в контейнере сервлетов (порт 8080) в среде, к которой можно получить доступ из Интернета (внешний) и из компании внутри (внутри), например

http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication

Входящие (внешние / внутренние) запросы перенаправляются в контейнер сервлетов с использованием http-сервера apache с mod_proxy. Конфигурация выглядит так:

ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /MyApplication http://localhost:8080/MyApplication

Теперь я столкнулся с проблемой, что некоторые ответы MyApplication зависят от исходного URL-адреса запроса. Конкретно: документ WSDL будет содержать элемент, имеющий schemaLocation="<RequestUrl>?xsd=MyApplication.xsd" элемент.

В моей текущей конфигурации это всегда выглядит как

<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>

но это должно быть

External Request: <xs:import namespace="..." schemaLocation="http://external.foo.bar/MyApplication?xsd=MyApplication.xsd"/>
Internal Request: <xs:import namespace="..." schemaLocation="http://internal.foo.bar/MyApplication?xsd=MyApplication.xsd"/>

Полагаю, это обычное требование. Но так как я не являюсь экспертом в настройке http-сервера apache и его модулей, я был бы рад, если бы кто-нибудь мог оказать некоторую (подробную) помощь.

Заранее спасибо!

PS: Я также разместил это на переполнение стека но подумал, что это может быть лучшим местом.

Если вы используете Apache> = 2.0.31, вы можете попробовать установить ProxyPreserveHost директива, как описано Вот.

Это должно передать исходный заголовок хоста через mod_proxy в ваше приложение, и обычно URL-адрес запроса будет перестроен там (в вашем контейнере сервлетов) с использованием заголовка Host, поэтому расположение схемы должно быть построено с использованием информации о хосте и пути из "до" прокси.

Вы должны иметь возможность выполнить mod_rewrite в apache, чтобы закодировать полный URL-адрес в качестве параметра запроса или, возможно, часть фрагмента. Насколько это может быть легко, зависит от того, можете ли вы использовать тот или иной в составе входящих запросов.

Например, http://external.foo.bar/MyApplication может быть переписан на http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication который затем передается в ProxyPass и затем удаляется.

Немного хака, да, и, возможно, немного сложно заставить перезапись и прокси-сервер работать в правильном порядке и не мешать друг другу, но похоже, что это должно работать.