Chcę przekierować wszystkie żądania HTTP do żądania https w ELB . Mam dwie instancje EC2. Używam nginx na serwerze. Próbowałem przepisać pliki conf Nginx bez żadnego sukcesu. Bardzo chciałbym uzyskać porady na ten temat.
Chcę przekierować wszystkie żądania HTTP do żądania https w ELB . Mam dwie instancje EC2. Używam nginx na serwerze. Próbowałem przepisać pliki conf Nginx bez żadnego sukcesu. Bardzo chciałbym uzyskać porady na ten temat.
Odpowiedzi:
Moduły równoważenia obciążenia aplikacji AWS obsługują teraz natywne przekierowanie HTTP na HTTPS.
Aby włączyć to w konsoli, wykonaj następujące czynności:
To samo można osiągnąć za pomocą interfejsu wiersza polecenia, jak opisano tutaj .
Można to również zrobić w Cloudformation, gdzie musisz skonfigurować obiekt Listener w następujący sposób:
HttpListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
StatusCode: HTTP_301
Port: 443
Jeśli nadal używasz klasycznych modułów równoważenia obciążenia, skorzystaj z jednej z konfiguracji NGINX opisanych przez innych.
instances
karty)
ELB ustawia X-Forwarded-Proto
nagłówek, możesz go użyć do wykrycia, czy pierwotne żądanie dotyczyło HTTP i przekierowania do HTTPS.
Możesz spróbować tego w swoim server
conf:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
Spójrz na dokumentację ELB .
nginx
konfiguracji, ale zasada ma zastosowanie do każdego serwera WWW.
Miałem ten sam problem, w mojej sytuacji HTTPS był obsługiwany w całości przez ELB i nie znałem domeny źródłowej z wyprzedzeniem, więc skończyło się na zrobieniu czegoś takiego:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
Następnie oczywiście wskazując ELB „https” na port instancji 80, a następnie trasę „http” do portu instancji 81.
Amazon Elastic Load Balancer (ELB) obsługuje nagłówek HTTP o nazwie X-FORWARDED-PROTO. Wszystkie żądania HTTPS przechodzące przez ELB będą miały wartość X-FORWARDED-PROTO równą „HTTPS”. W przypadku żądań HTTP możesz wymusić HTTPS, dodając następującą prostą regułę przepisywania. U mnie działa dobrze!
Apache
W pliku .htaccess możesz dodać następujące wiersze:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
Lub jeśli używasz vhost.conf do zarządzania wieloma domenami na tym samym serwerze internetowym EC2, możesz dodać następujący plik do vhost.conf (dodać go do domeny, w której chcesz używać https):
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
IIS
Zainstaluj moduł IIS Url-Rewrite, używając konfiguracyjnego GUI, dodaj następujące ustawienia:
<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>
Przeczytaj więcej tutaj
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Powyższe rozwiązania htaccess spowodowały niepowodzenie kontroli stanu ELB. Miałem problemy ze znalezieniem rozwiązania, dopóki nie znalazłem w Internecie artykułu, w którym ktoś miał te same problemy, co ja. Jego rozwiązaniem było dodanie tego na początku pliku htaccess zamiast tego:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Aby zezwolić na to i inne żądania lokalne za pośrednictwem protokołu HTTP podczas przekierowywania żądań zewnętrznych przez ELB do HTTPS, dostosuj warunek przepisywania tak, aby był zgodny z protokołem http zamiast wykluczającego dopasowania na https.
Może to nie być rozwiązanie, którego możesz szukać, ale inną opcją może być użycie AWS CloudFront oprócz ELB. CloudFront daje możliwość przekierowania całego przychodzącego ruchu HTTP do HTTPS.
Miałem dziwny problem z konfiguracją nginx i ELB. Moja konfiguracja obejmowała 3 różne usługi w jednym nginx za ELB. I miałem problem z mieszaną zawartością: kiedy twoje żądanie do ELB to https, ale wewnątrz ELB tylko http, a serwer tworzy ścieżkę względną do statycznej za pomocą http, więc przeglądarka nie działa z problemem `` mieszanej zawartości ''. I muszę stworzyć rozwiązanie dla obu protokołów http / https bez żadnych przekierowań.
Oto konfiguracja znajdująca się w nginx/conf.d/
folderze:
# Required for http/https switching
map $http_x_forwarded_port $switch {
default off;
"80" off;
"443" on;
}
Oznacza to, że będziemy mieć wiedzę, jaki jest prawdziwy protokół klienta. Jak widać, będziemy go mieli w $switch
var. W tej chwili używasz tego we wszystkich miejscach, w których tego potrzebujesz:
location ~ /softwareapi/index.php {
fastcgi_param HTTPS $switch;
.. other settings here ..
}
Dzięki ustawieniu HTTPS aplikacja php automatycznie wykryje właściwy protokół i starannie zbuduje ścieżkę względną, aby zapobiec problemom z mieszaną zawartością.
Z poważaniem.
Na podstawie odpowiedzi @ Ulli Jeśli chcesz skonfigurować go za pomocą Terraform , oto przykład>
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"
}
}
}
Utwórz plik .ebextensions/00_forward_http_to_https.config
z następującą zawartością:
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"
Upewnij się, że wcześniej ustawiłeś zmienną środowiskową APP_URL z konsoli zarządzania AWS.