it-swarm-eu.dev

Přesměrovat na https přes url přepsat v IIS uvnitř elastického beanstalk balanceru

Jak používat modul pro přepisování url služby IIS, který nutí uživatele používat ssl, zatímco jste za elastickým beanstalk balancerem?

24
Ross Pace

To je obtížnější, než to zní z několika důvodů. Jeden, vyvažovač zátěže se stará o ssl, takže požadavky předané z balanceru zátěže nikdy nepoužívají ssl. Pokud použijete tradiční přepisovací pravidlo, získáte nekonečnou smyčku přesměrování. Dalším problémem, s nímž je třeba se vypořádat, je to, že kontrola AWS healthcheck selže, pokud obdrží odpověď přesměrování.

  1. Prvním krokem v řešení je vytvoření stránky healthcheck.html a nastavení v kořenovém adresáři. Nezáleží na tom, co je obsahem.
  2. Nastavte balancer zátěže tak, aby používal soubor healthcheck.html pro zdravotní kontroly.
  3. Přidejte níže uvedené pravidlo přepsání do sekce <system.webServer><rewrite><rules> web.config:

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

Všimněte si, že shoda pravidla je na každém jiném souboru, než je náš healthcheck. Tím se zajistí, že kontrola vyvažovače zátěže bude úspěšná a omylem nepadne ze serveru.

Vyvažovač zátěže předává hodnotu X-Forwarded-Proto v záhlaví, což nám umožňuje zjistit, zda byl požadavek přes https nebo ne. Naše pravidlo se spustí, pokud tato hodnota není https a vrací trvalé přesměrování pomocí protokolu https.

38
Ross Pace

Nejdříve chci poděkovat Rossovi za jeho původní odpověď, to mi umožnilo vybudovat pravidlo IIS URL Rewrite, které pro mě fungovalo pomocí mého stávajícího pravidla přesměrování HTTP na HTTPS, které jsem používal před tím, než byly mé webové stránky pozadu. AWS Elastic Load Balancer.

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

Toto pravidlo vám umožňuje přístup na vaše stránky lokálně v rámci Visual Studio nebo na serveru na portu 80, aniž byste museli přistupovat přes HTTPS, takže musíte mít pouze vazbu pro port 80 na serveru. Netrpí věcmi, které jiní zmínili (duplikované dotazování atd.).

Já osobně jsem neměl žádný problém se zdravotní kontrolou, nemusel jsem vytvořit soubor na serveru pro elastické load balancer na ping. Mám svůj balancer zátěže nastaven na zdravotní kontrolu TCP:80 a funguje to.

13
Luke

Lukeova odpověď funguje perfektně, pokud používáte ELB, ale nebude fungovat s ALB. Odpověď na dotaz ALB Ross Pace je správná. Můžete však také kombinovat tyto dva způsoby, abyste mohli přistupovat na stránky lokálně bez přesměrování na HTTPS.

<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