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

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

Я запускаю WebApplication в контейнере сервлетов (порт 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 и его модулей, я был бы рад, если бы кто-то мог дать некоторую (подробную) помощь.

Спасибо заранее!

4b9b3361

Ответ 1

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

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

(Отправленный также для полноты)

Ответ 2

Вот еще одна альтернатива, если вы хотите сохранить как исходное имя узла, так и прокси-имя хоста.

Если вы используете mod_proxy disable ProxyPreserveHost в конфигурации Apache. Для большинства прокси-серверов, включая mod_proxy, прочитайте заголовок X-Forwarded-Host в своем приложении. Это идентифицирует исходный заголовок узла, предоставленный HTTP-запросом.

Здесь вы можете прочитать о заголовках mod_proxy (и возможных других стандартных прокси-серверов):

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

Ответ 3

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

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

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