У меня странная установка. Выглядит это так:
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
.