IIS 7.0でホストしているアプリケーションがあります。HTTPではなくHTTPSのみで動作することを確認する必要があるため、ルート構成に以下のルールを含めました。
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Found" />
</rule>
</rules>
</rewrite>
アプリケーションにアクセスしようとしたときにこのルールを追加すると、次のエラーが発生します。
ページのリダイレクトが多すぎます。このサイトのCookieをクリアするか、サードパーティのCookieを許可すると、問題が解決する場合があります。そうでない場合は、サーバー構成の問題であり、コンピューターの問題ではない可能性があります。いくつかの提案があります:このWebページを後で再読み込みします。この問題の詳細をご覧ください。
入力条件の下に置く:
<add input="{HTTPS}" pattern="on" />
の代わりに:
<add input="{HTTPS}" pattern="off" />
Elastic Load Balancingを使用して、ASP.NETアプリケーションをAWSでホストしていますが、受け入れられた回答を含む問題のルールは機能せず、無限のリダイレクトを引き起こし続けました。
これが最終的に私たちのために働いたルールです:
<rewrite>
<rules>
<rule name="HTTPS Rule behind AWS Elastic Load Balancer Rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}{URL}" redirectType="Found" />
</rule>
</rules>
</rewrite>
私の場合、次のように配置する必要がありました。
<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" />
<add input="{HTTPS}" pattern="on" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Found" />
</rule>
</rules>
IIS 10(Windows Server 2016)) here の手順に従って、書き換え用にわずかに異なるXML構成を生成します。
<rewrite>
<rules>
<rule name="HTTP 2 HTTPS" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Found" />
</rule>
</rules>
</rewrite>
パターンはoff
で、一致は*
のみです。
Liquid Web Cloud Sitesを使用していますが、まったく同じ問題に遭遇しました。
私はここで解決策を試しましたが、この条件のために必要なものにはうまくいきませんでした:
<add input="{HTTPS}" pattern="off" />
OPにあるように、これは、「HTTPSがオフのときにこのルールに一致して実装する」を意味します。そして、この質問に受け入れられた解決策はこれを単に反転させ、HTTPSがonの場合にルールに一致します。無限ループの問題は解決しましたが、これはルールが不正確に一致したためです。実際には、HTTPSがオフのときにリクエストをHTTPSに変更したいだけです。したがって、HTTP要求は転送されませんでした。
興味深いことに、HTTPSリクエストも転送されませんでした。これ(および他のいくつかのテスト)から、ブラウザにHTTPSが表示されても、サーバーはそれをHTTPリクエストのように処理していると判断しました。したがって、サーバーは常にHTTPリクエストを受信していると信じ、常にルールを無視します(HTTPSがオンの場合に一致するリクエストのみを指定するようになりました-決してしない)。
数時間の調査とテストの後、私は ここで説明 と同様の問題であると推測しました。
コストを削減するために(多くのホスティングプロバイダーがTMGゲートウェイにSSL証明書をインストールします)、このゲートウェイは、実際のWebサーバーに渡すときに要求を標準HTTPに書き換えるだけです。したがって、リクエストがヒットするまでにIISおよびWebアプリケーションは標準のプレーンHTTPリクエストです。
。
最終的に私は、Liquid Webのチームと話をして、自分のサイトに埋められた問題を解決するヘルプ記事の方向を教えてくれました。彼らは、それを修正した次の書き換えルールを使用することを提案しました。
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url=".*"/>
<conditions>
<add input="{HTTP_CLUSTER_HTTPS}" pattern="^on$" negate="true"/>
<add input="{HTTP_CLUSTER_HTTPS}" pattern=".+" negate="true"/>
</conditions>
<action type="Redirect" url="https://{HTTP_Host}{SCRIPT_NAME}" redirectType="SeeOther"/>
</rule>
</rules>
</rewrite>
</system.webServer>
同様の状況で他の人にもこれが機能することを願っています。
SNagが言及したように、AmazonのELBの背後にあるサイトがありました。次の入力ヘッダーなしで書き換えルールを適用しようとすると、無限リダイレクトが発生していました。これは、次のようにHTTP_X_FORWARDED_PROTOである入力タイプが必要な結果のようです:<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
。
AWSドキュメントから「アプリケーションまたはウェブサイトは、X-Forwarded-Protoリクエストヘッダーに格納されたプロトコルを使用して、適切なURLにリダイレクトする応答をレンダリングできます。」 DNSエントリを持つELBを使用して、サイトのあるサーバーに転送します。