Я хочу перенаправить весь HTTP-запрос на https-запрос на ELB . У меня два экземпляра EC2. Я использую nginx для сервера. Я безуспешно пытался переписать файлы конфигурации nginx. Я хотел бы получить совет по этому поводу.
Я хочу перенаправить весь HTTP-запрос на https-запрос на ELB . У меня два экземпляра EC2. Я использую nginx для сервера. Я безуспешно пытался переписать файлы конфигурации nginx. Я хотел бы получить совет по этому поводу.
Ответы:
Балансировщики нагрузки приложений AWS теперь поддерживают перенаправление с HTTP на HTTPS.
Чтобы включить это в консоли, сделайте следующее:
То же самое можно сделать с помощью интерфейса командной строки, как описано здесь .
Это также можно сделать в Cloudformation, где вам нужно настроить объект Listener следующим образом:
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
конфигурации, но принцип применим к любому веб-серверу.
У меня была такая же проблема, в моей ситуации 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, добавив следующее простое правило перезаписи. У меня работает нормально!
Apache
Вы можете добавить в файл .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 Url-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.
Возможно, это не то решение, которое вы ищете, но другим вариантом может быть использование 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
var. И в этот момент вы используете это везде, где вам это нужно:
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.