Перезапись 302 URL-адресов сервера приложений для перенаправления с помощью прокси-сервера Apache в середине

8

У меня странная настройка. Это выглядит так:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

На HTTPS-прокси (очень тупой прокси) URL-адрес выглядит как https: //proxy.domain.com/app. Затем он транслируется на Apache с использованием HTTP, как и http: //apache.domain.com/app (передавая хост proxy.domain.com). Затем Apache туннелирует запрос локально, используя протокол AJP, к ajp: // localhost: 8009 / app /.

Иногда сервер приложений хочет перенаправить запрошенный путь. Например, перенаправить / app / to / app / webapp. Таким образом, он отправляет 302 обратно в apache, перенаправляя путь - вероятно, что-то вроде ajp: // localhost: 8009 / app / webapp. Затем Apache переписывает URL-адрес перенаправления на http: //proxy.domain.com/app/webapp. Прокси HTTPS тупой, поэтому он не анализирует перенаправление и не меняет http на https.

Итак, я хотел бы выяснить, могу ли я настроить Apache для перезаписи URL-адреса перенаправления 302 для отправки пользователя на https.

Вот конфиг, который у меня есть в https.conf Apache:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Я попытался использовать ProxyPassReverse , но не смог выяснить, как заставить его перезаписать URL перенаправления 302 с https вместо http.

Какие-нибудь мысли?

Джордж
источник

Ответы:

9

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

Для тех, кто заинтересован, решение состоит не в том, чтобы использовать ProxyPassReverse , а в том, чтобы использовать директиву Header - это позволит вам связываться с исходящими заголовками. В этом случае я могу захватить заголовок ответа Location и выполнить регулярное выражение для него, чтобы исправить протокол URL:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Вуаля!

Если apache жалуется, возможно, mod_headers еще не включен: a2enmod headers

Джордж
источник
Не нужно редактировать заголовки, воспользуйтесь решением @wondy, чтобы tomcat узнал о протоколе LB / RProxy через RempteIpValve
Мухаммед Хьюди
Я использовал это решение. Я предпочитаю делать некоторые настройки Apache, а не заставлять Tomcat делать то, что я хочу!
froderik
3

Я нашел другой вариант.

На основании /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat и Apache ReverseProxyPass перенаправляет на http, а не на https, кажется, что некоторые серверы распознают заголовок X-Forwarded-Protocol , Можно заставить Tomcat распознать это, добавив:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

к server.xml.

Wodny
источник
1
Это лучшее решение, поэтому tomcat предназначен для такой работы
Мухаммед Хьюди
Я думаю, что вы имеете в виду X-Forwarded-Proto.
Майкл Хэмптон
Я совершенно уверен, что использовал «Протокол», и это сработало. Но это был март 2013 года. Я вижу, что обе версии использовались в течение некоторого времени. Как я вижу, тем временем был написан новый RFC 7239 (июнь 2014 г.). Вероятно, версия «Прото» победила и сейчас является стандартом.
водка