it-swarm.com.de

Umleitung von EC2 Elastic Load Balancer von HTTP nach HTTPS

Ich möchte alle HTTP-Anforderungen an die https-Anforderung am ELB umleiten. Ich habe zwei EC2-Instanzen. Ich benutze Nginx für den Server. Ich habe versucht, die Nginx Conf-Dateien ohne Erfolg umzuschreiben. Ich würde gerne einen Rat dazu bekommen.

89
Amit Badheka

AWS Application Load Balancer unterstützen jetzt die native Umleitung von HTTP zu HTTPS.

Führen Sie die folgenden Schritte aus, um dies in der Konsole zu aktivieren:

  1. Gehen Sie zu Ihrem Load Balancer in EC2 und klicken Sie auf "Listener".
  2. Wählen Sie in Ihrem HTTP-Listener "Regeln anzeigen/bearbeiten"
  3. Löschen Sie alle Regeln mit Ausnahme der Standardregeln (unten).
  4. Standardregel bearbeiten: Wählen Sie "Weiterleiten an" als Aktion, lassen Sie alles als Standard und geben Sie "443" als Port ein.

Native redirect listener rule

Dasselbe kann erreicht werden, indem die CLI wie beschrieben verwendet wird hier .

Dies ist auch in Cloudformation möglich, wo Sie ein Listener-Objekt wie das folgende einrichten müssen:

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

Wenn Sie weiterhin Classic Load Balancers verwenden, verwenden Sie eine der von den anderen beschriebenen NGINX-Konfigurationen.

55
Ulli

ELB setzt X-Forwarded-Proto -Header können Sie verwenden, um festzustellen, ob die ursprüngliche Anforderung HTTP lautete, und um dann zu HTTPS umzuleiten.

Sie können dies in Ihrem server conf versuchen:

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

Schauen Sie sich ELB docs an.

105
Dmitry Mukhin

Ich hatte das gleiche Problem, in meiner Situation wurde HTTPS vollständig von ELB gehandhabt und ich kannte meine Quelldomain nicht im Voraus, so dass ich am Ende so etwas wie Folgendes tat:

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

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

Und dann natürlich das ELB "https" auf den Instanz-Port 80 und dann die "http" -Route auf den Instanz-Port 81.

32
TylerFowler

Der Amazon Elastic Load Balancer (ELB) unterstützt einen HTTP-Header namens X-FORWARDED-PROTO. Alle HTTPS-Anforderungen, die über die ELB gesendet werden, haben den Wert von X-FORWARDED-PROTO gleich "HTTPS". Für die HTTP-Anforderungen können Sie HTTPS erzwingen, indem Sie die folgende einfache Überschreibregel hinzufügen. Bei mir funktioniert es gut!

Apache

Sie können Ihrer .htaccess-Datei folgende Zeilen hinzufügen:

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

Wenn Sie vhost.conf zum Verwalten mehrerer Domänen auf demselben EC2-Webserver verwenden, können Sie Folgendes zur vhost.conf hinzufügen (fügen Sie es der Domäne hinzu, für die Sie https verwenden möchten):

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

[~ # ~] iis [~ # ~]

Installieren Sie das IIS Url-Rewrite-Modul und fügen Sie über die Konfigurations-GUI die folgenden Einstellungen hinzu:

<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>

Lesen Sie mehr hier

15
Iman Sedighi

Es ist möglicherweise nicht die Lösung, nach der Sie suchen, aber eine andere Option ist die Verwendung von AWS CloudFront zusätzlich zu ELB. CloudFront bietet die Option, den gesamten eingehenden HTTP-Datenverkehr an HTTPS umzuleiten.

4
MojoJojo

Die oben genannten htaccess-Lösungen haben dazu geführt, dass der ELB-Health-Check fehlgeschlagen ist. Ich hatte einige Probleme, die Lösung zu finden, bis ich online einen Artikel entdeckte, in dem jemand die gleichen Probleme hatte, die ich hatte. Seine Lösung war, dies stattdessen an den Anfang der htaccess-Datei zu setzen:

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

Um diese und andere lokale Anforderungen über HTTP zuzulassen, während externe Anforderungen über die ELB an HTTPS umgeleitet werden, passen Sie die Umschreibebedingung so an, dass sie auf http und nicht auf https negativ übereinstimmt.

Quelle: HTTP mit AWS und ELB zu HTTPS umleiten

3
omikes

Ich hatte ein seltsames Problem mit der Konfiguration von Nginx und ELB. Mein Setup beinhaltete 3 verschiedene Services innerhalb eines Nginx hinter ELB. Und ich hatte ein Problem mit gemischtem Inhalt: Wenn Ihre Anfrage an ELB https lautet, aber nur innerhalb von ELB http und der Server einen relativen Pfad zu statischem Inhalt mithilfe von http erstellt, schlägt der Browser mit dem Problem "gemischter Inhalt" fehl. Und ich muss eine Lösung für beide http/https-Arbeiten ohne Weiterleitungen erstellen.

Hier befindet sich config in nginx/conf.d/ Mappe:

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

Dies bedeutet, dass wir wissen, was ein echtes Client-Protokoll ist. Wie Sie sehen können, haben wir es in $switch var. Und in diesem Moment verwenden Sie diese Funktion an allen Orten, an denen Sie sie benötigen:

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

Mit der HTTPS-Einstellung erkennt die PHP-Anwendung automatisch das richtige Protokoll und erstellt sorgfältig einen relativen Pfad, um ein Problem mit gemischten Inhalten zu vermeiden.

Freundliche Grüße.

3

Basierend auf der Antwort von @ Ulli Wenn Sie es mit Terraform konfigurieren möchten, finden Sie hier ein Beispiel>

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"
    }
  }
}

Quelle

1
user4912329