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

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

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

Ответы [ 3 ]

26 голосов
/ 23 мая 2011

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

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

(Опубликовано здесь также для полноты картины)

6 голосов
/ 30 апреля 2013

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

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

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

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

1 голос
/ 20 мая 2011

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

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

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

...