web-dev-qa-db-ja.com

Elastic beanstalkのロードバランサー内でIISのURL書き換えを介してhttpsにリダイレクトします

Elastic Beanstalkロードバランサーの背後にいるときに、IISのURL書き換えモジュールを使用して、ユーザーにsslの使用を強制する方法を教えてください。

26
Ross Pace

これは、いくつかの理由で、思ったより難しいです。 1つは、ロードバランサーがsslを処理するため、ロードバランサーから渡されるリクエストがsslを使用することはありません。従来の書き換えルールを使用すると、リダイレクトの無限ループが発生します。対処するもう1つの問題は、リダイレクト応答を受信するとAWSヘルスチェックが失敗することです。

  1. ソリューションの最初のステップは、healthcheck.htmlページを作成し、ルートディレクトリに設定することです。コンテンツが何であるかは関係ありません。
  2. ヘルスチェックにhealthcheck.htmlファイルを使用するようにロードバランサーを設定します。
  3. 以下の書き換えルールをweb.configの<system.webServer><rewrite><rules>セクションに追加します。

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

ルールの一致は、ヘルスチェックファイル以外のものにあることに注意してください。これにより、ロードバランサーのヘルスチェックが成功し、サーバーを誤って負荷から落とさないようにします。

ロードバランサーは、ヘッダーでX-Forwarded-Proto値を渡します。これにより、リクエストがhttps経由かどうかがわかります。このルールは、その値がhttpsでない場合にトリガーされ、httpsを使用して永続的なリダイレクトを返します。

40
Ross Pace

まず、Rossの元の答えに感謝したいと思います。これにより、IIS URL Rewriteルールが、既存のHTTPからHTTPSへのリダイレクトルールを使用して機能するようになりました私のウェブサイトが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>

このルールを使用すると、HTTPS経由でアクセスする必要なく、Visual Studio内のローカルサイトまたはポート80上のサーバーにサイトにアクセスできるため、サーバー上のポート80のバインディングのみが必要です。他の人が言及したこと(クエリ文字列の重複など)の影響を受けません。

個人的にはヘルスチェックに問題はありませんでした。ElasticLoad Balancerがpingを実行するためにサーバーにファイルを作成する必要はありませんでした。ロードバランサーをTCP:80のヘルスチェックに設定しましたが、機能します。

13
Luke

ELBを使用している場合、Lukeの回答は完璧に機能しますが、ALBでは機能しません。 ALBのロスペースの答えは正しいです。ただし、この2つを組み合わせて、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