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

Обратный прокси-сервер Apache для приложения на tomcat с портом 8080 дает неправильный URL-адрес в заголовке ответа

У меня есть сервер 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 генерируется серверной частью
  • Apache проверяет конфигурацию на наличие ProxyPassReverse xxx http://ext-domain:8080/app
  • при совпадении Apache продолжает HTTP 302 xxx/foo (этот шаг не происходит в вашем случае)
  • если xxx не является полным URL-адресом, он расширяется обычным ServerName и подобное (так что полное значение ProxyPassReverse /app42 ... для Apache сказать 302 http://ext-domain/app42)
  • Apache также знает, что браузер взаимодействует с портом Apache 80, поэтому он не будет перенаправлять браузер по ошибке на 8080, если вы не укажете ему явно с неверно настроенным ServerName.