Перенаправлення регулятора еластичного навантаження EC2 з HTTP на HTTPS


104

Я хочу перенаправити весь HTTP-запит на https-запит на ELB . У мене є два екземпляри EC2. Я використовую nginx для сервера. Я спробував переписати файли nginx conf без будь-якого успіху. Я хотів би поради з цього приводу.


1
Схоже, що Інтернет не може погодитися на єдине, повне і діюче рішення цієї проблеми. Сподіваюся, ви можете отримати допомогу тут, у моєму дописі . Мені довелося стрибати через обручі, щоб придумати це, нарешті.
ADTC

1
Цей анс має останнє рішення, а не прийнятий
ансер

Відповіді:


87

Балансори завантаження додатків AWS тепер підтримують нативну HTTP на переадресацію HTTPS.

Щоб увімкнути це в консолі, виконайте наступне:

  1. Перейдіть до балансира завантаження в EC2 та вкладку "Слухачі"
  2. Виберіть "Перегляд / редагування правил" на вашому слухачі HTTP
  3. Видалити всі правила, за винятком стандартного (внизу)
  4. Редагувати правило за замовчуванням: виберіть "Перенаправити на" як дію, залиште все як за замовчуванням та введіть "443" як порт.

Правило рідного слухача для переадресації

Те саме можна досягти, використовуючи CLI, як описано тут .

Це також можливо зробити в Cloudformation, де вам потрібно встановити об'єкт слухача таким чином:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Якщо ви все ще використовуєте класичні балансири навантаження, перейдіть до одного з конфігурацій NGINX, описаних іншими.


1
Дуже корисно зараз знати простіше. Але це буде кращою відповіддю з додатковою інформацією про те, що налаштувати замість просто посилання.
Джон Різ

1
@JohnRees відповідним чином відредагував відповідь, сподіваюся, що це допоможе
Уллі

Приємно. Я запропонував тобі досягти нуля. Ви заслуговуєте на більше.
Джон Різ

2
@florian ви, здається, використовуєте класичний балансир завантаження. Щоб перейти до цього варіанту,
Ulli

як мені призначити Балансир завантаження програм для мого примірника? (оскільки instancesвкладки немає )
Флоріан

107

ELB встановлює X-Forwarded-Protoзаголовок, ви можете використовувати його, щоб визначити, чи був початковий запит на HTTP, і перенаправити на HTTPS тоді.

Ви можете спробувати це в serverконфіденційності:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

Погляньте на документи ELB .


3
Де можна зробити цю конфігурацію?
ericpeters0n

2
@ ericpeters0n фрагмент у відповіді призначений для nginxconfig, але принцип застосовний до будь-якого веб-сервера.
Дмитро Мухін

1
якщо ви використовуєте beanstalk з автономним пасажиром, перейдіть за цим посиланням, щоб дізнатися про зміну конфігурації nginx. qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho

3
Переконайтеся, що у вашому балансирі завантаження є слухачі HTTP та HTTPS.
Гевін Палмер

1
@Ronald, від конфіденційного сервера у відповіді, я маю на увазі nginx-сервер на екземплярах ec2, які працюють за ELB.
Дмитро Мухін

34

У мене була така ж проблема, в моїй ситуації HTTPS повністю використовувався ELB, і я не знав свого вихідного домену достроково, тому я в кінцевому підсумку робив щось на кшталт:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

І тоді, звичайно, вказуючи ELB 'https' на порт 80 примірника, а потім маршрут 'http' до порту 81 примірника.


3
Це геній.
Енді Хайден

2
@CodyBugstein це конфігурація nginx, якщо у вас є
timurso

@timurso якщо у вас є що?
CodyBugstein

@CodyBugstein, якщо перед вашою заявкою є nginx (я, наприклад, ні, він спрямований безпосередньо до контейнера, на якому працює ExpressJS)
timurso

Куди піде nginx? Всередині ELB? Всередині EC2? Це десь налаштовано в Elastic Beanstalk?
CodyBugstein

16

Amazon Elastic Load Balancer (ELB) підтримує HTTP-заголовок під назвою X-FORWARDED-PROTO. Для всіх HTTPS-запитів, що проходять через ELB, значення X-FORWARDED-PROTO має значення "HTTPS". Для HTTP-запитів ви можете змусити HTTPS, додавши наступне просте правило перезапису. Для мене це працює чудово!

Апач

Ви можете додати наступні рядки у свій .htaccess файл:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

Або якщо ви використовуєте vhost.conf для управління кількома доменами на одному веб-сервері EC2, ви можете додати наступне до vhost.conf (додайте його до домену, для якого ви хочете використовувати https):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

Встановіть модуль IIS Ur-Rewrite, використовуючи графічний інтерфейс конфігурації, додайте ці налаштування:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

Детальніше читайте тут


У нас виникла проблема з тим, щоб наш екземпляр перенаправляв звичайний http-трафік, оскільки заголовок навіть не був. Я вирішую це, поставивши умову:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
натроніт

Це викликає нескінченні переадресації. Я використовую IIS з сервером Windows.
Це пастка

@ Itatrap: Для IIS, якщо він не працював, то спробуйте скрипт за цією URL-адресою: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi

5

Наведені вище рішення щодо htaccess призвели до відмови перевірки стану ELB. У мене були проблеми з пошуку рішення, поки я не виявив статтю в Інтернеті, в якій у когось були ті самі проблеми, що і у мене. Його рішення полягало в тому, щоб додати це до початку файлу htaccess:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Щоб дозволити цей та інші локальні запити через HTTP під час перенаправлення зовнішніх запитів через ELB на HTTPS, відрегулюйте умову перезапису, щоб відповідати на http замість негативного збігу на https.

Джерело: Перенаправлення HTTP на HTTPS за допомогою AWS та ELB


"налаштувати умову перезапису, щоб вона відповідала http, а не негативній відповідності на https", це частина, яку я намагався виправити. Дякую!
Merricat


3

У мене були дивні проблеми з конфігурацією nginx та ELB. Моя настройка включала 3 різні служби всередині однієї nginx позаду ELB. І у мене була змішана проблема вмісту: коли ваш запит на ELB є https, але всередині ELB http тільки, і сервер створює відносний шлях до статики за допомогою http, тому браузер не вдається з проблемою "змішаного вмісту". І я повинен створити рішення для роботи http / https без перенаправлень.

Ось конфігурація, розташована в nginx/conf.d/папці:

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

Це означає, що ми будемо знати, що таке реальний протокол клієнта. Як бачите, ми матимемо його у $switchвар. У цей момент ви використовуєте це в усіх місцях, де вам це потрібно:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

Завдяки налаштуванню HTTPS php додаток автоматично виявить правильний протокол і ретельно побудує відносний шлях для запобігання випуску змішаного вмісту.

З найкращими побажаннями.


3

На основі відповіді @ Ulli Якщо ви хочете налаштувати її за допомогою Terraform , ось ось приклад>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Джерело


-2

Створіть файл .ebextensions/00_forward_http_to_https.configіз таким вмістом:

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

Обов’язково заздалегідь встановіть змінну середовища APP_URL з консолі управління AWS.


Як я можу це зробити, балансуючи TCP-з'єднання з ELB?
бум

1
Я не бачу, де відповідь відповідає на запитання ... ви говорите про еластичну плодоніжку бобів, а питання - про nginx всередині EC2.
jvarandas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.