Я установил обратный прокси-сервер apache, который обрабатывает SSL-шифрование для tomcat. У нас есть веб-приложение Struts, и каждый раз, когда мы используем response.sendRedirect()
, приложение возвращается к обычному протоколу HTTP вместо того, чтобы оставаться на HTTPS. Приложение должно работать с обоими протоколами, и я не могу обрабатывать SSL через контейнер tomcat.
Я могу использовать HTTPS и перемещаться по ссылкам и действиям. Но если я перейду к действию, в котором используется перенаправление, это будет только HTTP. Почему это так?
SSLProxyEngine [off|on] # (Differs between the ssl and the other normal conf)
ProxyPreserveHost On
ProxyPass / http://mysite:1234/
ProxyPassReverse / http://mysite:1234/
Это мой конфиг. Я думал о переключении http
к https
в конфигурации ssl, но это приводит к следующему:
Плохой шлюз
Прокси-сервер получил недопустимый ответ от вышестоящего сервера. Кроме того, при попытке использовать ErrorDocument для обработки запроса возникла ошибка 502 Bad Gateway.
Как я могу заставить перенаправления придерживаться HTTPS?
Если sendRedirect использует относительный путь, Tomcat добавит абсолютные элементы, включая схему (http / https) и имя сервера.
Схема по умолчанию будет использовать http, если вы ее не переопределите. Имя сервера будет взято из заголовка хоста, который вы уже тщательно передали.
У меня была такая же проблема, и я использовал новый разъем Tomcat (наряду с существующим) на отдельном порту, который переопределяет схему и устанавливает порт для хорошей меры:
<Connector port="8443" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
scheme="https" proxyPort="443"/>
Затем в Apache виртуальный хост SSL имеет:
ProxyPass / http://<tomcat_server>:8443/
Обычный виртуальный хост HTTP продолжает использовать существующий порт соединителя (8080).
В качестве альтернативы вы можете жестко запрограммировать место перенаправления при вызове sendRedirect (), но это явно негибко.
Я решил эту проблему, просто добавив следующую директиву ProxyPassReverse в конфигурацию сервера Apache:
ProxyPassReverse / http://<apacheserver>:<httpsport>/