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

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

У меня странная установка. Выглядит это так:

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 / на / 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.

Есть предположения?

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

Для тех, кому интересно, решение не использовать ProxyPassReverse, а лучше использовать Заголовок директива - это позволяет вам возиться с исходящими заголовками. В этом случае я могу захватить заголовок ответа 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

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

На основе https://stackoverflow.com/questions/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.