Обратный прокси с Apache ProxyPass перенаправляет вместо прозрачного прохождения

У меня есть веб-приложение, работающее внутри Tomcat по адресу http://<server>:8080/app/portal/. Я хочу, чтобы мир увидел это приложение через URL-адрес http://<server>/portal/.

Для этого я настроил обратный прокси с Apache 2.2. Согласно документации для ProxyPass, я ожидаю, что обратный прокси-сервер будет прозрачно передавать все запросы. Мой браузер никогда не должен знать об URL-адресе Tomcat.

Вот моя конфигурация:

Никаких виртуальных хостов, я добавил эти строки в свой httpd.conf

<Location /portal/>
    AllowOverride All
    RewriteEngine On
    ProxyPass  http://server:8080/app/portal/
    ProxyPassReverse http://server:8080/app/portal/
 </Location>

Когда я использую Firefox для открытия http://<server>/portal/, я получаю 302 Временно перемещено, и все последующие вызовы идут из моего браузера прямо на http://<server>:8080/app/portal/. Мой браузер указывает на этот URL.

Это не то, что я ожидал от обратного прокси. Я неправильно настроил конфигурацию или неправильно понял назначение обратных прокси? Что я должен сделать, чтобы получить желаемое поведение?


person Matthias Kempka    schedule 25.05.2012    source источник
comment
при чем здесь RewriteEngine On?   -  person s.webbandit    schedule 25.05.2012
comment
Хороший вопрос. Я скопировал это из другой рабочей конфигурации, где у нас действительно были перезаписи. Я удалил его, и он ведет себя точно так же.   -  person Matthias Kempka    schedule 25.05.2012


Ответы (3)


Я попытался прокомментировать ответ от davidethell, но не смог правильно отформатировать строки, поэтому вот что я узнал:

Проблема заключалась в том, что обратный прокси-сервер, по-видимому, работает только с URL-адресом, по которому War развернут в моем Tomcat, а НЕ с сервлетом внутри Tomcat. Это приводит к 2 перезаписям, одна из которых — обратный прокси, а другая просто перезаписывает все, что стоит за этим.

RewriteEngine On
RewriteRule   ^/portal/$ /portal/portal
RewriteRule   ^/portal(.+) http://<server>:8080/app$1 [P]
person Matthias Kempka    schedule 31.05.2012
comment
Рад, что у вас получилось! Прошло некоторое время с тех пор, как я делал подобное обратное проксирование с Tomcat и Apache. Я обнаружил, что коннектор Apache в долгосрочной перспективе намного надежнее. - person davidethell; 31.05.2012
comment
Кажется, это работает при перезаписи URL-адресов, но я столкнулся с запрещенной проблемой 403. - person ThemeZ; 03.12.2012

Вы забыли добавить следующую опцию в конфигурацию обратного прокси:

ProxyPreserveHost On

Вы можете добиться такого же поведения с помощью перезаписи URL-адресов, но это не рекомендуется в документации.

person Marsu_    schedule 08.09.2014

Вы пробовали использовать опцию mod_rewrite Proxy вместо ProxyPass? Что-то типа:

RewriteRule ^$ http://server:8080/app/portal/ [P]
person davidethell    schedule 25.05.2012
comment
Спасибо за подсказку. Это было не так просто, но в правильном направлении. Подробности смотрите в моем ответе ниже - person Matthias Kempka; 31.05.2012