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

Обратный прокси-сервер Apache возвращается к небезопасному протоколу после перенаправления

Я установил обратный прокси-сервер 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>/