У меня есть сервер Apache (2.2) со следующей конфигурацией для обратного прокси-сервера для приложения, работающего на tomcat (6) на порту 8080.
....
ServerName ext-domain
ProxyPreserveHost On
ProxyPass /myapp http://int-domain:8080/myapp
ProxyPassReverse /myapp http://int-domain:8080/myapp
....
Когда я получаю доступ к указанному ниже URL из браузера
"http://ext-domain/myapp"
Я получаю замену URL ниже в адресной строке браузера.
"http://ext-domain:8080/myapp"
И журнал доступа к apache говорит ...
"GET /myapp HTTP/1.1" 302 421 "-" "Mozilla/5.0"...
Как избежать вставки этого порта 8080 в URL ответа?
Может кто-нибудь помочь в этом? Спасибо.
Обновите ProxyPassReverse, как показано ниже.
ProxyPassReverse /myapp http://ext-domain/myapp
Обратитесь: http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html#usage
Хорошо, старый ответ неполон. Причина: ProxyPreserveHost на. Этот пункт вам вряд ли когда-нибудь понадобится.
Таким образом, исходный шаблон конфигурации должен быть:
....
ServerName ext-domain
ProxyPass /app http://int-domain:8080/myapp
ProxyPassReverse /app http://int-domain:8080/myapp
....
Создается поразительный ответ 302 на бэкэнде. Вы сказали бэкэнд заголовок Host: ext-domain
, это эффект ProxyPreserveHost
, поэтому бэкэнд хочет быть приятным и послушным, и если ему нужно дать вам 302 редирект, он также использует тот же ext-domain
как удобство тебе. Backed знает, к какому порту вы подключились, поэтому пытается использовать тот же порт, что и удобство тебе. Если это не удобно, не используйте ProxyPreserveHost
во-первых, это наиболее чистое и наименее запутанное решение проблемы. Для большинства приложений (не для всех) не потребуется ProxyPreserveHost
, но используйте обычный X-Forwaded-xxx
заголовки.
Обработка 302 примерно такая:
HTTP 302 http://ext-domain:8080/app/foo
генерируется серверной частьюProxyPassReverse xxx http://ext-domain:8080/app
HTTP 302 xxx/foo
(этот шаг не происходит в вашем случае)ServerName
и подобное (так что полное значение ProxyPassReverse /app42 ...
для Apache сказать 302 http://ext-domain/app42
)ServerName
.