it-swarm.com.de

Umleitung zu https durch URL-Umschreiben in IIS innerhalb des Load Balancer der elastischen Beanstalk

Wie können Sie das URL-Umschreibungsmodul von IIS verwenden, um Benutzer zu zwingen, SSL zu verwenden, während Sie sich hinter einem elastischen Beanstalk-Lastausgleich befinden?

24
Ross Pace

Dies ist aus einigen Gründen schwieriger als es sich anhört. Zum einen kümmert sich der Load Balancer um ssl, so dass die vom Load Balancer übergebenen Anforderungen niemals ssl verwenden. Wenn Sie die traditionelle Umschreibungsregel verwenden, erhalten Sie eine unendliche Schleife von Weiterleitungen. Ein weiteres Problem, mit dem man sich auseinandersetzen muss, besteht darin, dass die AWS-Statusprüfung fehlschlägt, wenn eine Umleitungsantwort empfangen wird.

  1. Der erste Schritt in der Lösung besteht darin, eine healthcheck.html-Seite zu erstellen und sie im Stammverzeichnis anzugeben. Es ist egal, was der Inhalt ist.
  2. Richten Sie Ihren Lastausgleicher so ein, dass die Datei healthcheck.html für Zustandsprüfungen verwendet wird.
  3. Fügen Sie die Umschreibungsregel unten in den Abschnitt <system.webServer><rewrite><rules> Ihrer web.config ein:

    <rule name="Force Https" stopProcessing="true">
       <match url="healthcheck.html" negate="true" />
       <conditions>
           <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
       </conditions>
       <action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Permanent" />
    </rule>
    

Beachten Sie, dass die Regelübereinstimmung sich auf etwas anderes als unsere Healthcheck-Datei bezieht. Dadurch wird sichergestellt, dass die Integritätsprüfung des Load Balancers erfolgreich ausgeführt wird und der Server nicht versehentlich von der Last getrennt wird.

Der Load Balancer übergibt den X-Forwarded-Proto-Wert in der Kopfzeile, der uns mitteilt, ob die Anforderung über https erfolgte oder nicht. Unsere Regel wird ausgelöst, wenn dieser Wert nicht https ist und eine permanente Weiterleitung mithilfe von https zurückgegeben wird.

38
Ross Pace

Zunächst möchte ich Ross für seine ursprüngliche Antwort danken, die mich auf den Weg machte, eine IIS URL-Rewrite-Regel aufzubauen, die für mich funktionierte, indem ich meine vorhandene HTTP-zu-HTTPS-Umleitungsregel verwendete, die ich vor meiner Website verwendet hatte stand hinter einem elastischen Load Balancer von AWS.

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
        <add input="{REMOTE_Host}" pattern="localhost" negate="true" />
        <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true" />
        <add input="{HTTP_Host}" pattern="localhost" negate="true" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent" />
</rule>

Mit dieser Regel können Sie lokal auf Ihren Standort in Visual Studio oder auf dem Server an Port 80 zugreifen, ohne über HTTPS darauf zugreifen zu müssen. Sie müssen also nur eine Bindung für Port 80 auf dem Server haben. Es leidet nicht unter den Dingen, die andere erwähnt haben (doppelte Querzeichenfolge usw.).

Ich persönlich hatte keine Probleme mit der Zustandsprüfung. Ich musste keine Datei auf dem Server erstellen, damit der elastische Lastverteiler ping. Ich habe meinen Load Balancer auf TCP:80 auf Zustandsprüfung gesetzt, und es funktioniert.

13
Luke

Lukas Antwort funktioniert perfekt, wenn Sie eine ELB verwenden, aber nicht mit einer ALB zusammenarbeiten. Für ein ALB Ross Pace ist die Antwort richtig. Sie können die beiden auch so kombinieren, dass Sie lokal auf die Site zugreifen können, ohne zu HTTPS umgeleitet zu werden.

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="healthcheck.html" negate="true" />
        <conditions>
            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
            <add input="{REMOTE_Host}" pattern="localhost" negate="true"/>
            <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true"/>
            <add input="{HTTP_Host}" pattern="localhost" negate="true"/>
        </conditions>
    <action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent"/>
</rule>
1
Trevor Orr