Проблема с перенаправлением HTTPS на HTTP с помощью Elastic Load Balancer на сервер Tomcat - PullRequest
9 голосов
/ 29 марта 2012

У меня есть ELB (Amazon Elastic Load Balancer), настроенный на балансировку нагрузки запросов конечных пользователей по HTTPS, на бэкэнде мое приложение работает на сервере Tomcat, настроенном на HTTP.

Поэтому, когда мои конечные пользователи делают запрос к приложению, запрос будет осуществляться по HTTPS, поскольку теперь они обращаются к ELB, теперь ELB внутренне перенаправляет его по HTTP на сервер Tomcat.В tomcat мое приложение защищено с помощью Spring Security, и если запрос относится к защищенному ресурсу, а пользователь не вошел в систему, он перенаправляется на настроенную страницу входа.Теперь это перенаправление на конечного пользователя будет осуществляться через HTTP, поскольку сервер tomcat изначально получил запрос от ELB как HTTP.Теперь это приведет к 404, поскольку я не настроил входящий трафик по HTTP.

Как мы решаем эту проблему?Это единственный вариант иметь HTTPS как на enduser-ELB, так и на ELB-tomcat, или я что-то здесь упускаю?

Ответы [ 2 ]

10 голосов
/ 29 марта 2012

ELB устанавливает заголовок X-Forwarded-Proto, который позволяет вам указать, какой протокол клиент использовал для подключения к вашему балансировщику нагрузки.См. документацию .

. Вы можете настроить Spring Security для просмотра этого заголовка, см. этот ответ , например.

0 голосов
/ 02 октября 2016

Мне было трудно найти это по сети, и, наконец, я нашел способ сделать это.

Проблема заключалась в том, что как только http перенаправлялся на порт https на внутреннем ELB, он возвращался обратнона порт 80, таким образом, создавая петлю.Это происходит потому, что ELB выгружает SSL, а затем снова подключается к порту 80.

Наконец, после некоторых исследований я получил правильное правило перезаписи для управления X-Forwarded-Proto таким образом, что даже если ELB разгрузит SSL-котатеперь доходит до того, что исходный запрос использовал SSL.

Это делается с помощью Tomcat Valves на Tomcat 8. Я уверен, что это можно сделать и в более ранних версиях.Я включил правила перезаписи на Tomcat, используя клапаны.После этого это было так же просто, как написание правил перенаправления на Apache.

Вот шаги:

Шаг 1:

a.Откройте context.xml в папке conf tomcat b.Вставьте следующую строку чуть ниже

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

Примечание. Это активирует клапан в глобальном масштабе.Если это необходимо включить для определенного хоста, его следует вставить в файл server.xml для этого конкретного домена

Шаг 2:

a.Откройте conf / server.xml b.Вставьте следующую строку чуть выше </Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

Шаг 3:

a.Откройте папку, где находится web.xml.Например, если приложение размещено в ROOT, тогда web.xml будет находиться в webapps / ROOT / WEB-INF

b.Аналогично, если приложение размещено в webapps / myappfolder, тогда файл web.xml будет находиться в webapps / myappfolder / WEB-INF

c.В папке WEB-INF создайте новый файл rewrite.config .и вставьте следующее правило перезаписи:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
...