Я хочу перенаправити весь HTTP-запит на https-запит на ELB . У мене є два екземпляри EC2. Я використовую nginx для сервера. Я спробував переписати файли nginx conf без будь-якого успіху. Я хотів би поради з цього приводу.
Я хочу перенаправити весь HTTP-запит на https-запит на ELB . У мене є два екземпляри EC2. Я використовую nginx для сервера. Я спробував переписати файли nginx conf без будь-якого успіху. Я хотів би поради з цього приводу.
Відповіді:
Балансори завантаження додатків AWS тепер підтримують нативну HTTP на переадресацію HTTPS.
Щоб увімкнути це в консолі, виконайте наступне:
Те саме можна досягти, використовуючи 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, описаних іншими.
instances
вкладки немає )
ELB встановлює X-Forwarded-Proto
заголовок, ви можете використовувати його, щоб визначити, чи був початковий запит на HTTP, і перенаправити на HTTPS тоді.
Ви можете спробувати це в server
конфіденційності:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
Погляньте на документи ELB .
nginx
config, але принцип застосовний до будь-якого веб-сервера.
У мене була така ж проблема, в моїй ситуації HTTPS повністю використовувався ELB, і я не знав свого вихідного домену достроково, тому я в кінцевому підсумку робив щось на кшталт:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
І тоді, звичайно, вказуючи ELB 'https' на порт 80 примірника, а потім маршрут 'http' до порту 81 примірника.
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>
Детальніше читайте тут
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Наведені вище рішення щодо 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
Можливо, це не рішення, яке ви можете шукати, але іншим варіантом може бути використання AWS CloudFront на додаток до ELB. CloudFront дає можливість перенаправляти весь вхідний HTTP-трафік на HTTPS.
У мене були дивні проблеми з конфігурацією 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 додаток автоматично виявить правильний протокол і ретельно побудує відносний шлях для запобігання випуску змішаного вмісту.
З найкращими побажаннями.
На основі відповіді @ 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"
}
}
}
Створіть файл .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.