IISリダイレクトの記述方法について
こんにちは!入社5年目のエンジニアです。
今回はIISでリダイレクトを設定する手順やよくあるIISリダイレクトの設定をご紹介します。
IISリダイレクトについて
IIS(Internet Information Services)は、Microsoft Windows用のWebサーバーソフトウェアであり、IISリダイレクトはHTTPリクエストを処理する際に要求されたURLを別のURLに遷移(リダイレクト)させることができます。
この機能を使用する際には、web.configファイルにリダイレクトルールを定義し記述することで特定のURLパターンに基づいてリダイレクトすることが可能です。
設定の仕方
まず初めに一番シンプルな形のリダイレクトルールを解説します。
リダイレクト元:http://example.com/index.html
リダイレクト先:http://example.com/
上記ようにhttp://example.com/index.htmlにアクセスされたときにhttp://example.com/へリダイレクトさせたい場合、web.config では次のように記述することでリダイレクトが可能です。
<rule name="RD_1" enabled="true" patternSyntax="ExactMatch" stopProcessing="true">
<match url="index.html" />
<action type="Redirect" url="/" />
</rule>
記述方法について詳しく解説します。
rule name="RD_1"
リライトルールの名前を指定しています。名前を指定することで、複数のルールを区別することができます。
名前は他リダイレクトと重複しないようにする必要があります。
enabled="true"
リライトルールが有効か無効かを示す設定です。trueに設定されているため、このルールは有効となっています。
patternSyntax="ExactMatch"
パターンの指定方法を示す設定です。 ExactMatchは完全一致を意味しており、このルールが適用されるURLはパターンと完全に一致する必要があります。
部分一致にしたい場合はpatternSyntax="Wildcard"と記述することで設定可能です。
stopProcessing="true"
マッチする最初のリライトルールが見つかった際に、その後のルールの処理を停止するかどうかの記載です。
trueのため条件に合致する最初のルールに一致した場合、それ以降のルールはスキップされます。
match url="index.html"
リライトルールが適用されるURLを指定しています。
action type="Redirect"
リライトルールがマッチした場合のアクションを指定しています。
url="/"
ダイレクト先のURLです。
よくある設定
ここからは使用頻度の高いIISリダイレクトを解説します。
指定ディレクトリ以下すべてのURLをリダイレクト
リダイレクト元:http://example.com/aaaaa/bbbbb/ 以下すべて
リダイレクト先:http://example.com/xxxxx/yyyyy/
<rule name="RD_2_1" enabled="true" patternSyntax="ExactMatch" stopProcessing="true">
<match url="aaaaa/bbbbb" />
<action type="Redirect" url="/xxxxx/yyyyy" />
</rule>
<rule name="RD_2_2" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^aaaaa/bbbbb.*" />
<action type="Redirect" url="/xxxxx/yyyyy" />
</rule>
RD_2_1で/aaaaa/bbbbb/のページを/xxxxx/yyyyy/へリダイレクトし、
さらにRD_2_2で正規表現を使い/aaaaa/bbbbb/以下すべてのページをリダイレクトしています。
RD_2_2では正規表現を使用するためpatternSyntax="ECMAScript"を記載しています。
ディレクトリ以下すべてリダイレクトしたいが、特定のURLのみをリダイレクト対象から外す場合
<rule name="RD_2_3" enabled="true" patternSyntax="ExactMatch" stopProcessing="true">
<match url="index.html" />
<action type="None" />
</rule>
指定ディレクトリ以下すべてリダイレクトする記述に追加する形で記載します。
3行目のaction type="None"はアクションを実行しないことを意味しています。そのため/aaaaa/bbbbb/以下のindex.htmlにアクセスがあった場合はリダイレクトが行われず、ディレクトリ以下すべてのリダイレクトの対象から除外することができます。
リダイレクト元がトップページの場合
<rule name="RD_3" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="/" />
</rule>
patternSyntax="ECMAScript"
パターンの指定方法を示しており、ECMAScriptは、JavaScript の正規表現構文(ECMAScript 準拠)を使ってパターンを記述することを意味しています。
match url="^$"
この部分では正規表現パターンが指定されています。^$は、文字列の先頭から末尾までが空であることにマッチする正規表現です。つまり、URLが空(ドメイン直下)の場合にマッチします。
パラメータ付きのリダイレクト
リダイレクト元:http://example.com/aaaaa.html?param=000
リダイレクト先:http://example.com/bbbbb
<rule name="RD_4" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^/aaaaa.html$" />
<conditions>
<add input="{QUERY_STRING}" pattern="(^|&)param=([0-9]+)($|&)" />
</conditions>
<action type="Redirect" url="/bbbbb" appendQueryString="false" />
</rule>
<conditions>
この要素内でルールが適用される条件を指定します。
add input="{QUERY_STRING}"
input=で条件を適用する入力変数を指定します。今回はクエリ文字列を指定しています。
pattern="(^|&)param=([0-9]+)($|&)"
クエリ文字列が特定のパターンに一致するかどうかの確認を行う部分です。
Paramの前後で(^|&)、($|&)の部分でパラメータがクエリ文字列の先頭にあるか直前に "&" がある場合、また末尾にあるか直後に "&" がある場合にリダイレクトがされるよう設定しています。
appendQueryString="false"
リダイレクト先のURLにクエリ文字列を追加するかどうかを設定しています。今回はfalseにしているためリダイレクト先のURLにはクエリ文字列は追加されません。
httpからhttpsへリダイレクト
リダイレクト元:http://example.com/aaaaa.html
リダイレクト先:https://example.com/aaaaa.html
<rule name="SSL_redirect" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{SERVER_PORT}" pattern="^80$" />
<add input="{HTTP_HOST}" pattern="^example.com$" />
</conditions>
<action type="Redirect" url="https://{SERVER_NAME}/{R:1}" redirectType="Found" />
</rule>
match url="^(.*)$"
ここですべてのURLを対象としています。
<add input="{SERVER_PORT}" pattern="^80$" />
リクエストがポート80で受信されたかどうかをチェックしています。
<add input="{HTTP_HOST}" pattern="^example.com$" />
リクエストされたホストがexample.comかどうかをチェックしています。
url="https://{SERVER_NAME}/{R:1}"
{SERVER_NAME}の部分はリクエストされたサーバーのホスト名に置き換えられリダイレクトが実行されます。
また{R:1}の部分にリダイレクト元のパス部分がURLとして反映されます。
WWWなしからWWWありにリダイレクト
リダイレクト元:https://example.com/
リダイレクト先:https://www.example.com/
<rule name="RD_WWW_01" stopProcessing="true">
<match url="^(.)$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example.com$" />
<add input="{SERVER_PORT}" pattern="^80$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:1}" />
</rule>
<rule name="RD_WWW_02" stopProcessing="true">
<match url="^(.)$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example.com$" />
<add input="{SERVER_PORT}" pattern="^443$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:1}" />
</rule>
上記はRD_WWW_01でHTTPのポートが80である場合にマッチ、RD_WWW_02でHTTPSのポートが443である場合にマッチするように設定しています。
一般的にHTTPはポート80、HTTPSはポート443を使用しているためこの記述にしていますが、異なるポート番号を使用している場合は適切なポート番号に設定してください。
WAF経由のIPアドレス制限(ホワイトリスト方式)
ホワイトリスト方式では許可されたIPアドレスのリストを作成し、そのリストに含まれるIPアドレスからのリクエストのみを許可します。それ以外のIPアドレスからのリクエストは拒否されます。
<rule name="IP_restrictions_allow" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^.*$" />
<conditions logicalGrouping="MatchAny">
<add input="{REMOTE_ADDR}" pattern="^(00\.11\.22\.333(:[0-9]+)?$)" />
<add input="{HTTP_X_Forwarded_For}" pattern="^(00\.11\.22\.333(:[0-9]+)?$)" />
</conditions>
<action type="None" />
</rule>
<rule name="IP_restrictions_defaultdeny" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^.*$" />
<conditions>
<add input="{HTTP_X_Forwarded_For}" pattern="^.*$" />
</conditions>
<action type="Redirect" url="/403.aspx" />
</rule>
{HTTP_X_Forwarded_For}
通常、インターネット上のクライアントからのリクエストはそのままサーバーに送信されますが、一部のシステムでは、サーバーが直接クライアントのIPアドレスを取得することが難しい場合があります。 そのため、{HTTP_X_Forwarded_For}部分は、クライアントからのリクエストがWAFを経由してサーバーに到達した場合に、実際のクライアントのIPアドレスを取得するために使用されます。
WAF経由のIPアドレス制限(ブラックリスト方式)
ブラックリスト方式では拒否されるべきIPアドレスのリストを作成し、そのリストに含まれるIPアドレスからのリクエストを拒否します。それ以外のIPアドレスからのリクエストは許可されます。
<rule name="IP_restrictions_deny" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^.*$" />
<conditions logicalGrouping="MatchAny">
<add input="{REMOTE_ADDR}" pattern="^(0\.11\.22\.33|444\.555\.666\.777)$" />
<add input="{HTTP_X_Forwarded_For}" pattern="^(0\.11\.22\.33|444\.555\.666\.777)(:[0-9]+|,.+)?$" />
</conditions>
<action type="Redirect" url="/403.aspx" />
</rule>
さいごに
IISリダイレクトの設定について詳しくご紹介しました。今回説明したIISリダイレクトの設定は一部であり、他にもさまざまなリダイレクトルールが存在します。リダイレクトを適切に設定することでユーザーエクスペリエンスを向上させ、SEO対策にも効果的です。ぜひこれらの手順を参考に、Webサイトやアプリケーションの要件や目的に応じて適切な条件を設定し効果的なリダイレクトを実装していただければ幸いです。