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

Как перенаправить HTTP на HTTPS в AWS Application Load Balancer?

Наш веб-сайт требует соответствия HIPAA, поэтому все должно быть зашифровано. Я не хочу, чтобы клиент получал сообщение об ошибке при вводе "http: //mysite.com ", поэтому мне нужно поддерживать как HTTP, так и HTTPS, а также перенаправлять HTTP на HTTPS. Я прав?

Я правильно сделал на веб-серверах. Поэтому, если я напрямую подключаюсь к веб-серверам, HTTP автоматически перенаправляется на HTTPS. Все хорошо.

Но веб-серверы находятся за балансировщиком нагрузки приложений AWS. Я не знаю, как перенаправить HTTP на HTTPS на ELB. Так клиентские браузеры все еще может подключиться к ELB через HTTP.

Как настроить HTTP => HTTPS на балансировщике нагрузки приложений AWS?

Другими словами, я уверен, что соединение между ELB и веб-серверами - HTTPS, но как сделать так, чтобы соединение между клиентскими браузерами и ELB было HTTPS?

По состоянию на июль 2018 г., это поддерживается балансировщиками нагрузки приложений.

  • Добавить / отредактировать HTTP:80 слушатель
  • Установите действие на Redirect
  • протокол: https
  • порт: 443
  • установите следующий раскрывающийся список на Original host, path, query
  • установите последнее раскрывающееся меню на 301 - Permanently moved

Изображение настроек прослушивателя HTTP to HTTPS на балансировщике нагрузки приложений AWS

Обычно происходит то, что ELB настроен на получение https (порт 443) и пересылку в экземпляр EC2 (цель балансировщика нагрузки) по http (порт 80).

Внутренний веб-сервер перенаправляет эти запросы на порт 443 балансировщика нагрузки, вызывая бесконечный цикл перенаправления (между балансировщиком нагрузки и внутренним веб-сервером).

Типичное сообщение об ошибке: ERR_TOO_MANY_REDIRECTS.

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

Для nginx конфигурация будет выглядеть так:

server {
    listen   80;
    server_name    www.example.org;   
    if ($http_x_forwarded_proto = 'http') {
         return 301 https://$server_name$request_uri;   
    }
}

а для apache .htaccess примерно так:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

ПРИМЕЧАНИЕ. Хотя кто-то может подумать, что было бы удобно, если бы это можно было обработать без перенастройки веб-сервера, по состоянию на весну 2018 года нет способа решить эту проблему, используя только ELB, т.е. вы должны настроить свой веб-сервер, чтобы эта работа работала.

Вы можете добавить приведенную ниже конфигурацию в свой файл .htaccess. Но перед этим убедитесь, что на сервере включен mod_rewrite и не запрещен файл .htaccess.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Для подробного объяснения просмотрите официальную документацию с конца aws. https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb/