URL リライト モジュール構成リファレンス

作成者: Ruslan Yakushev

この記事では、URL 書き換えモジュールの概要と、モジュールで使用される構成の概念について説明します。

機能の概要

URL 書き換えモジュールは、要求 URL を、ユーザーまたは Web アプリケーションに表示されるシンプルでわかりやすい検索エンジンフレンドリ アドレスに書き換えます。 URL 書き換えでは、定義された規則を使用して、IIS Web サーバーによって処理される前に、要求 URL を評価し、ルールで定義されたアドレスにマップします。 正規表現とワイルドカードを含む URL 書き換えロジックを定義できます。ルールは、要求 URL、HTTP ヘッダー、およびサーバー変数に基づいて適用できます。 モジュールの主な目的は、要求 URL をよりわかりやすい URL に書き換することですが、モジュールを使用して、リダイレクトを実行するルールの定義、カスタム応答の送信、要求の中止を行うこともできます。

書き換えルールの概要

書き換えルールでは、要求 URL を比較または照合するロジックと、比較が成功した場合の対処方法を定義します。

書き換えルールは、次の部分で構成されます。

  • パターン – ルール パターンは、URL 文字列の照合に使用される正規表現または野生カード パターンを指定するために使用されます。
  • Conditions – オプションの条件コレクションは、URL 文字列がルール パターンと一致する場合に実行する追加の論理操作を指定するために使用されます。 条件内で、HTTP ヘッダーまたはサーバー変数の特定の値をチェックしたり、要求された URL が物理ファイル システム上のファイルまたはディレクトリに対応しているかどうかを確認したりできます。
  • アクション – アクションは、URL 文字列がルール パターンと一致し、すべてのルール条件が満たされた場合の対処方法を指定するために使用されます。

書き換えルールのスコープ

書き換えルールは、次の 2 つの異なるコレクションで定義できます。

  • <globalRules> – このコレクションのルールは、サーバー レベルでのみ定義できます。 グローバル ルールは、サーバー全体の URL 書き換えロジックを定義するために使用されます。 これらの規則は ApplicationHost.config ファイル内で定義されており、下位の構成レベルではオーバーライドまたは無効にできません。 グローバル ルールは、常に絶対 URL のパス (つまり、サーバー名のない要求された URI) で動作します。 これらの規則は、IIS 要求処理パイプライン (PreBeginRequest イベント) の早い段階で評価されます。
  • <rules> – このコレクション内のルールは分散ルールと呼ばれ、構成階層内の任意のレベルで定義できます。 分散ルールは、特定の構成スコープに固有の URL 書き換えロジックを定義するために使用されます。 この種類の規則は、Web.config ファイルを使用するか、ApplicationHost.config または Web.config ファイル内のタグを使用 <location> して、任意の構成レベルで追加できます。 分散ルールは、定義されている Web.config ファイルの場所を基準にした URL パスに対して動作します。 分散ルールがタグ内 <location> で定義されている場合は、そのタグに指定された <location> パスを基準にして URL パスを操作します。 これらのルールは、IIS パイプラインの BeginRequest イベントで評価されます。

規則の評価

IIS の各構成レベルには、0 個以上の書き換え規則を定義できます。 ルールは、指定された順序で評価されます。 URL 書き換えモジュールは、次のアルゴリズムを使用してルールのセットを処理します。

  1. まず、URL がルールのパターンと照合されます。 一致しない場合、URL 書き換えモジュールはそのルールの処理を直ちに停止し、次のルールに進みます。
  2. パターンが一致し、ルールの条件がない場合、URL 書き換えモジュールはこのルールに対して指定されたアクションを実行し、次のルールに進み、置換された URL をそのルールの入力として使用します。
  3. パターンが一致し、ルールの条件がある場合は、URL 書き換えモジュールによって条件が評価されます。 評価が成功すると、指定されたルール アクションが実行され、書き換えられた URL が後続のルールへの入力として使用されます。

ルールで StopProcessing フラグが有効になっている場合があります。 ルール アクションが実行され (ルールが一致した場合)、このフラグがオンになると、後続のルールが処理されなくなり、要求が IIS 要求パイプラインに渡されることを意味します。 既定では、このフラグはオフになっています。

ルールの継承

ルールが複数の構成レベルで定義されている場合、URL 書き換えモジュールはルールを次の順序で評価します。

  1. すべてのグローバル ルールを評価します。
  2. 親構成レベルの分散ルールと、現在の構成レベルの規則を含むルール セットを評価します。 評価は親子の順序で実行されます。つまり、親ルールは最初に評価され、最後の子レベルで定義された規則は最後に評価されます。

元の URL の保持

URL 書き換えモジュールは、要求された元の URL パスを次のサーバー変数に保持します。

  • HTTP_X_ORIGINAL_URL – このサーバー変数には、デコードされた形式の元の URL が含まれています。
  • UNENCODED_URL – このサーバー変数には、Web クライアントから要求されたとおりの元の URL が含まれ、元のエンコードはすべて保持されます。

書き換えルールから URL パーツにアクセスする

書き換えルールから URL 文字列の特定の部分にアクセスする方法を理解することが重要です。

この形式の HTTP URL の場合: http(s)://<host>:<port>/<path>?<Querystring>

  • パス>は<ルールのパターンと照合されます。
  • <クエリ文字列>は、QUERY_STRINGと呼ばれるサーバー変数で使用でき、ルール内の条件を使用してアクセスできます。
  • ホスト>は<サーバー変数HTTP_HOSTで使用でき、ルール内の条件を使用してアクセスできます。
  • ポート>は<サーバー変数Standard Edition RVER_PORTで使用でき、ルール内の条件を使用してアクセスできます。
  • サーバー変数 Standard Edition RVER_PORT_Standard Edition CURE と HTTPS を使用して、セキュリティで保護された接続が使用されたかどうかを判断できます。 これらのサーバー変数には、ルール内の条件を使用してアクセスできます。
  • サーバー変数REQUEST_URIを使用して、クエリ文字列を含む、要求された URL パス全体にアクセスできます。

たとえば、この URL http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3に対して要求が行われ、サイト レベルで書き換えルールが定義されている場合は、次のようになります。

  • ルール パターンは、URL 文字列 content/default.aspx を入力として取得します。
  • QUERY_STRING サーバー変数に含まれています tabid=2&subtabid=3
  • HTTP_HOST サーバー変数に含まれています www.mysite.com
  • Standard Edition RVER_PORT サーバー変数に含まれる .80
  • Standard Edition RVER_PORT_Standard Edition CURE サーバー変数が含まれており、0HTTPS に含まれていますOFF
  • REQUEST_URI サーバー変数に含まれている /content/default.aspx?tabid=2&subtabid=3.
  • PATH_INFO サーバー変数に含まれている /content/default.aspx.

分散ルールに渡される入力 URL 文字列は、ルールが定義されている Web.config ファイルの場所に対して常に相対的であることに注意してください。 たとえば、要求が行われhttp://www.mysite.com/content/default.aspx?tabid=2&subtabid=3、書き換えルールが /content ディレクトリに定義されている場合、ルールは入力としてdefault.aspxこの URL 文字列を取得します。

書き換えルールの構成

ルール パターン

書き換えルール パターンは、現在の URL パスを比較するパターンを指定するために使用されます。 現在は、このコンテキストでは、ルールが適用されたときの URL パスの値を意味します。 現在のルールの前にルールがあった場合は、元の要求された URL と一致し、変更されている可能性があります。 パターンに対して評価される URL 文字列には、クエリ文字列は含まれません。 ルールの評価にクエリ文字列を含めるには、ルールの条件で QUERY_STRING サーバー変数を使用できます。 詳細については、「書き換えルールでのサーバー変数の使用」を参照してください

パターンは、書き換えルールの <一致> 要素内で指定されます。

ルール パターンの構文

ルール パターン構文は、ルールの patternSyntax 属性を使用して指定できます。 この属性は、次のいずれかのオプションに設定できます。

ECMAScript – Perl 互換 (ECMAScript 標準準拠) 正規表現構文。 これは、任意のルールの既定のオプションです。 これはパターン形式の例です: "^([_0-9a-zA-Z-]+/)?(wp-.*)"

ワイルドカードIIS HTTP リダイレクト モジュールで使用される Wildカード 構文。 "/Scripts/*_in.???" という形式のパターンの例を次に示します。アスタリスク ("*") は"任意の数の文字に一致し、バックリファレンスでキャプチャ" を意味し、"?" は 1 文字に一致することを意味します (バックリファレンスは作成されません)。

patternSyntax 属性のスコープはルールごとであり、現在のルールのパターンとそのルールの条件内で使用されるすべてのパターンに適用されます。

ルール パターンのプロパティ

パターンは、match> 要素の <negate 属性を使用して否定できます。 この属性を使用すると、現在の URL が指定されたパターンと一致しない場合にのみ、ルール アクションが実行されます。

既定では、大文字と小文字を区別しないパターン マッチングが使用されます。 大文字と小文字の区別を有効にするには、ルールの match> 要素の <ignoreCase 属性を使用できます。

規則の条件

ルール条件を使用すると、現在の URL 文字列以外の入力に基づいて、ルール評価用の追加ロジックを定義できます。 任意のルールに 0 個以上の条件を設定できます。 ルールの条件は、ルール パターンの一致が成功した後に評価されます。

条件は、書き換えルールの <条件> コレクション内で定義されます。 このコレクションには、条件の評価方法を制御する logicalGrouping という属性があります。 ルールに条件がある場合、ルール アクションはルール パターンが一致し、次の場合にのみ実行されます。

  • logicalGrouping="MatchAll" が使用されている場合、すべての条件が true として評価されました。
  • logicalGrouping="MatchAny" が使用されている場合、条件の少なくとも 1 つが true と評価されました。

条件は、次のプロパティを指定することによって定義されます。

  • 入力文字列
  • 種類の一致

条件入力では、条件評価の入力として使用する項目を指定します。 条件入力は、サーバー変数と、以前の条件パターンやルール パターンへのバック参照を含めることができる任意の文字列です。

一致の種類には、次の 3 つのオプションのいずれかを指定できます。

  • IsFile – この一致の種類は、入力文字列にファイル システム上のファイルへの物理パスが含まれているかどうかを判断するために使用されます。 条件入力文字列が指定されていない場合、URL 書き換えモジュールは、要求されたファイルの物理パスを条件入力の既定値として使用します。 この一致の種類は、分散ルールにのみ使用できます。

  • IsDirectory – この一致の種類は、入力文字列にファイル システム上のディレクトリへの物理パスが含まれているかどうかを判断するために使用されます。 条件入力文字列が指定されていない場合、URL 書き換えモジュールは、要求されたファイルの物理パスを条件入力の既定値として使用します。 この一致の種類は、分散ルールにのみ使用できます。

  • パターン – この一致型は、任意の入力文字列が正規表現パターンと照合される条件を表すために使用されます。 条件パターンは、正規表現構文を使用するか、またはワイルドカード構文を使用して指定できます。 条件で使用するパターンの種類は、この条件が 属するルールに対して定義されている patternSyntax フラグの値によって異なります。 この条件の種類には、パターン マッチングを制御する 2 つの関連属性があります。

    • pattern – この属性を使用して、実際のパターンを指定します。
    • ignoreCase – この属性を使用して、条件のパターン マッチングで大文字と小文字を区別するか、大文字と小文字を区別するかを制御します。

さらに、条件評価の結果は、否定属性を 使用して否定 できます。 これは、次の例のように、要求された URL がファイルでない場合にチェックする条件を指定するために使用できます。

<add input="{REQUEST_FILENAME}" matchType="isFile" negate="true">

ルール アクション

書き換えルール アクションは、現在の URL がルール パターンと一致し、条件の評価が成功したときに実行されます (ルールの構成によっては、一致したすべての条件または一致した条件のいずれか 1 つ以上のいずれか)。 使用できるアクションにはいくつかの種類があり、アクション>構成要素の <type 属性を使用して、ルールが実行するアクションを指定できます。 以降のセクションでは、さまざまなアクションの種類と、特定のアクションの種類に関連する構成オプションについて説明します。

書き換えアクション

書き換えアクションは、現在の URL 文字列を置換文字列に置き換えます。 置換文字列では、常に URL パスを指定する必要があります (例: contoso/test/default.aspx)。 ファイル システム上の物理パスを含む置換 (たとえば) は、 C:\inetpub\wwwrootIIS ではサポートされないことに注意してください。

書き換えアクションには、次の構成オプションがあります。

  • url – 現在の URL を書き換えるときに使用する置換文字列です。 置換 URL は、次を含めることができる文字列値です。

    • 条件とルール パターンへのバックリファレンス。 (詳細については、バックリファレンスの使用方法に関するセクションを参照してください)。
    • サーバー変数。 (詳細については、サーバー変数の使用方法に関するセクションを参照してください。
  • appendQueryString – 置換中に現在の URL のクエリ文字列を保持するかどうかを指定します。 既定では、appendQueryString フラグの値が指定されていない場合、TRUE と見なされます。 つまり、元の URL のクエリ文字列が置換された URL に追加されます。

リダイレクト アクション

リダイレクト アクションは、リダイレクト応答をクライアントに返すように URL 書き換えモジュールに指示します。 リダイレクト状態コード (3xx) は、このアクションのパラメーターとして指定できます。 応答の Location フィールドには、ルールで指定された置換文字列が含まれています。

リダイレクト ルールの置換 URL は、次のいずれかの形式で指定できます。

  • 相対 URL パス – contoso/test/default.aspx
  • 絶対 URI – https://example.com/contoso/test/default.aspx

リダイレクト アクションの使用は、 リダイレクト の実行後に現在の URL に対して後続のルールが評価されていないことを意味します。

リダイレクト アクションには、次の構成オプションがあります。

  • url – リダイレクト URL として置換文字列を使用します。 置換 URL は、次を含めることができる文字列です。

    • 条件とルール パターンへのバックリファレンス。 (詳細については、バックリファレンスの使用方法に関するセクションを参照してください)。
    • サーバー変数。 (詳細については、サーバー変数の使用方法に関するセクションを参照してください。
  • appendQueryString – 置換中に現在の URL のクエリ文字列を保持するかどうかを指定します。 AppendQueryString フラグが指定されていない場合、既定では TRUE と見なされます。 つまり、元の URL のクエリ文字列が置換された URL に追加されます。

  • redirectType – リダイレクト時に使用する状態コードを指定します。

    • 301 – 永続的
    • 302 – 見つかりました
    • 303 – その他を参照
    • 307 – 一時的

CustomResponse アクション

CustomResponse アクションを実行すると、ユーザー指定の状態コード、サブコード、および理由を使用して、URL 書き換えモジュールが HTTP クライアントに応答します。 CustomResponse アクションを使用すると、このアクションの実行後に、現在の URL に対して後続のルールが評価されません。

CustomResponse アクションには、次の構成オプションがあります。

  • statusCode – クライアントへの応答で使用する状態コードを指定します。
  • subStatusCode – クライアントへの応答で使用するサブステータス コードを指定します。
  • statusReason – 状態コードで使用する理由フレーズを指定します。
  • statusDescription – 応答の本文に配置する 1 行の説明を指定します。

AbortRequest アクション

AbortRequest アクションにより、URL 書き換えモジュールは現在の要求の HTTP 接続を削除します。 アクションにはパラメーターがありません。 このアクションを使用すると、このアクションの実行後に現在の URL に対して後続のルールが評価されません。

None アクション

None アクションは、アクションが実行されていないことを指定するために使用されます。

書き換えルールでのサーバー変数の使用

サーバー変数は、現在の HTTP 要求に関する追加情報を提供します。 この情報を使用して、書き換えの決定を行うか、書き換えられた URL を作成できます。 サーバー変数は、書き換えルール内の次の場所で参照できます。

  • 条件入力文字列内

  • ルール置換文字列では、具体的には次のようになります。

    • 書き換えとリダイレクト アクションの url 属性
    • CustomResponse アクションの statusLineresponseLine

サーバー変数は、{VARIABLE_NAME} 構文を使用して参照できます。 たとえば、次の条件では、QUERY_STRING サーバー変数を使用します。

<add input="{QUERY_STRING}" pattern="id=([0-9]+)" />

サーバー変数を使用して、現在の要求から HTTP ヘッダーにアクセスすることもできます。 現在の要求によって提供されるすべての HTTP ヘッダーは、この名前付け規則に従って生成された名前を持つサーバー変数として表されます。

  1. HTTP ヘッダー名内のすべてのダッシュ ("-") シンボルは、アンダースコア記号 ("_") に変換されます。
  2. HTTP ヘッダー名のすべての文字は大文字に変換されます。
  3. "HTTP_" プレフィックスがヘッダー名に追加されます。

たとえば、書き換えルールから HTTP ヘッダー "user-agent" にアクセスするには、{HTTP_U Standard Edition R_AGENT} サーバー変数を使用できます。

書き換えルールでのバックリファレンスの使用

ルールまたは条件の入力の一部は、バックリファレンスでキャプチャできます。 これらを使用して、ルール アクション内に置換 URL を作成したり、ルール条件の入力文字列を作成したりできます。

バック参照は、ルールに使用されるパターン構文の種類に応じて、さまざまな方法で生成されます。 ECMAScript パターン構文を使用する場合は、バックリファレンスをキャプチャする必要があるパターンの部分をかっこで囲むことで、バックリファレンスを作成できます。 たとえば、パターン ([0-9]+)/([a-z]+).htmlでは、この要求された URL から 07アーティクルがバックリファレンスでキャプチャされます: 07/article.html。 "Wildカード" パターン構文を使用する場合、パターンでアスタリスク記号 (*) を使用すると、バック参照が常に作成されます。 パターンで "?" が使用されている場合、バック参照は作成されません。 たとえば、パターン */*.html は contoso をキャプチャし、要求された URL contoso/test.html からバックリファレンスでテストします。

バック参照の使用は、キャプチャに使用されたパターン構文に関係なく同じです。 バック参照は、書き換えルール内の次の場所で使用できます。

  • 条件入力文字列

  • ルール アクションでは、具体的には次のようになります。

    • 書き換えとリダイレクト アクションの url 属性
    • CustomResponse アクションの statusLineresponseLine
  • 書き換えマップの キー パラメーター内

条件パターンへのバックリファレンスは {C:N} によって識別されます。N は 0 から 9 です。 ルール パターンへのバックリファレンスは {R:N} によって識別されます。N は 0 から 9 です。 両方の種類のバック参照 {R:0} と {C:0} には、一致する文字列が含まれていることに注意してください。

たとえば、このパターンでは次のようになります。

^(www\.)(.*)$

文字列の場合: www.foo.com バック参照は次のようにインデックス付けされます。

{C:0} - www.foo.com
{C:1} - www.
{C:2} - foo.com

ルール アクション内では、ルール パターンと、そのルールの最後に一致した条件へのバックリファレンスを使用できます。 条件入力文字列内では、ルール パターンと以前に一致した条件へのバック参照を使用できます。

次の規則の例では、バックリファレンスを作成して参照する方法を示します。

<rule name="Rewrite subdomain">
 <match url="^(.+)" /> <!-- rule back-reference is captured here -->
 <conditions>
  <add input="{HTTP_HOST}" type="Pattern" pattern="^([^.]+)\.mysite\.com$" /> <!-- condition back-reference is captured here -->
 </conditions>
 <action type="Rewrite" url="{C:1}/{R:1}" /> <!-- rewrite action uses back-references to condition and to rule when rewriting the url -->
</rule>

IIS 出力キャッシュとの対話

URL 書き換えモジュールは、次の目的で IIS 出力キャッシュの動作を制御します。

  1. 書き換えられた URL の応答のカーネル モードとユーザー モード出力キャッシュを最適に利用するため、URL 書き換えモジュールを使用する Web アプリケーションのパフォーマンスが向上します。
  2. URL の書き換えによってキャッシュ ロジックに違反する可能性がある場合は、応答のキャッシュを防止します。

モジュールは、特定のキャッシュ プロパティを変更するか、キャッシュを完全に無効にすることで、出力キャッシュを制御します。 IIS 構成または IIS パイプライン内の他のモジュールによって無効にされている場合、モジュールは出力キャッシュを有効にできません。 出力キャッシュは次のように制御されます。

  1. モジュールは常に、ユーザー モードキャッシュ設定 varyByHeader="HTTP_X_ORIGINAL_URL" を設定します。 これにより、ユーザー モードのキャッシュが有効になっている場合、モジュールはキャッシュ エントリのキーを構築するために元の URL を考慮に入れるようにします。

  2. 書き換え規則セットで、プロセスの有効期間を通じて一定の値または要求された URL から派生した値を持つサーバー変数を使用する場合、規則セットは出力キャッシュに対して安全と見なされます。 つまり、URL 書き換えモジュールは、手順 1 で説明したように varyByHeader を設定する以外の方法で既存のキャッシュ ポリシーを変更しません。

    次のサーバー変数は、書き換え規則で使用される場合、出力キャッシュ ポリシーには影響しません。

    • "CACHE_URL"
    • "DOCUMENT_ROOT"
    • "HTTP_URL"
    • "HTTP_HOST"
    • "PATH_INFO"
    • "PATH_TRANSLATED"
    • "QUERY_STRING"
    • "REQUEST_FILENAME"
    • "REQUEST_URI"
    • "SCRIPT_FILENAME"
    • "SCRIPT_NAME"
    • "SCRIPT_TRANSLATED"
    • "UNENCODED_URL"
    • "URL"
    • "URL_PATH_INFO"
    • ""APP_POOL_ID"
    • "APPL_MD_PATH"
    • "APPL_PHYSICAL_PATH"
    • "GATEWAY_INTERFACE"
    • "Standard Edition RVER_SOFTWARE"
    • "SSI_EXEC_DISABLED"
  3. 書き換え規則セットで、上記の一覧にメンションされていないサーバー変数が使用されている場合、規則セットは出力キャッシュでは安全でないと見なされます。 つまり、URL 書き換えモジュールでは、要求 URL が書き換えられたかどうかにかかわらず、すべての要求のカーネル モード キャッシュが無効になります。 さらに、モジュールは、ルール セットで使用されるすべてのサーバー変数値の連結文字列を含むキャッシュ プロパティ varyByValue を設定することで、ユーザー モード キャッシュのキャッシュ ポリシーを変更します。

文字列関数

書き換えルール アクション内の値を変更するために使用できる 3 つの文字列関数と、任意の条件があります。

  • ToLower - 小文字に変換された入力文字列を返します。
  • UrlEncode - URL エンコード形式に変換された入力文字列を返します。 この関数は、書き換えルールの置換 URL に特殊文字が含まれている場合に使用できます (たとえば、ASCII 以外の文字や URI の安全でない文字)。
  • UrlDecode - URL エンコードされた入力文字列をデコードします。 この関数は、パターンと照合する前に条件入力をデコードするために使用できます。

関数は、次の構文を使用して呼び出すことができます。

{function_name:any_string}

ここで、"function_name" は次のようになります。"ToLower"、"UrlEncode"、"UrlDecode"。 "Any_string" には、リテラル文字列またはサーバー変数またはバック参照を使用して構築された文字列を指定できます。 たとえば、文字列関数の有効な呼び出しを次に示します。

{ToLower:DEFAULT.HTM}
{UrlDecode:{REQUEST_URI}}
{UrlEncode:{R:1}.aspx?p=[résumé]}

文字列関数は、書き換えルール内の次の場所で使用できます。

  • 条件入力文字列

  • ルール置換文字列では、具体的には次のようになります。

    • 書き換えアクションとリダイレクト アクションの url 属性
    • CustomResponse アクションの statusLine 属性と responseLine 属性

ToLower 関数を使用するルールの例を次に示します。

<rule name="Redirect to canonical url">
 <match url="^(.+)" /> <!-- rule back-reference is captured here -->
 <conditions>
  <!-- Check whether the requested domain is in canonical form -->
  <add input="{HTTP_HOST}" type="Pattern" pattern="^www\.mysite\.com$" negate="true" /> 
 </conditions>
 <!-- Redirect to canonical url and convert URL path to lowercase -->
 <action type="Redirect" url="http://www.mysite.com/{ToLower:{R:1}}" redirectType="Found" />
</rule>

UrlEncode 関数を使用するルールの例を次に します。

<rules>
   <rule name="UrlEncode example" stopProcessing="true">
   <match url="resume" />
   <action type="Rewrite" url="default.aspx?name={UrlEncode:résumé}"/>
</rule>

UrlDecode 関数を使用するルールの例を次に します。

<rules>
   <rule name="UrlDecode example">
      <match url="default.aspx" />
      <conditions>
         <add input="{UrlDecode:{QUERY_STRING}}" pattern="résumé" />
      </conditions>
      <action type="Rewrite" url="default.aspx?type=resume" />
   </rule>
</rules>

書き換えマップ

書き換えマップは、書き換えルール内で使用して、書き換え時に置換 URL を生成できる名前と値のペアの任意のコレクションです。 書き換えマップが特に便利なのは、多数の書き換えルールがあり、そのすべてが静的文字列を使用する場合です (つまり、パターン マッチングが使用されない場合です)。 このような場合は、大量の単純な書き換えルールのセットを定義する代わりに、すべてのマッピングを、入力 URL と置換 URL の間のキーと値として書き換えマップに配置できます。 次に、入力 URL に基づいて置換 URL を検索するために、書き換えマップを参照する書き換えルールが 1 つ作成されます。

書き換えマップは、次の例のように、名前と値のペア文字列の名前付きコレクションを定義します。

<rewriteMap name="MyRewriteMap" defaultValue="">
  <add key="a.html" value="b.html" />
  <add key="c.aspx" value="d.aspx" />
  <add key="e.php" value="f.php" />
</rewriteMap>

書き換えマップは名前によって一意に識別され、0 個以上のキー値エントリを含めることができます。 さらに、書き換えマップでは、キーが見つからないときに使用する既定値を指定できます。 これは defaultValue 属性を使用して制御されます。 既定では、空の文字列が既定値として使用されます。

ファイル レベルを除き、任意の数の書き換えマップを任意の構成レベルで使用できます。 書き換えマップは、rewriteマップ> コレクション要素内<にあります。

書き換えマップは、次の構文を使用して書き換えルール内で参照されます。

{RewriteMapName:Key}

Key パラメーターには任意の文字列を指定でき、ルールまたは条件パターンへのバック参照を含めることができます。 たとえば、書き換えマップの有効な使用方法を次に示します。

{MyRewriteMap:contoso/{R:1}/test/{C:1}}
{MyRewriteMap:a.html}
{MyRewriteMap:{R:1}?{C:1}&contoso=test}

書き換えマップへの参照は、書き換えマップ参照内でパラメーターとして渡されたキーを使用して検索された値に置き換えます。 キーが見つからなかった場合は、その書き換えマップの既定値が使用されます。

書き換えマップは、書き換えルール内の次の場所で参照できます。

  • 条件入力文字列

  • ルール置換文字列では、具体的には次のようになります。

    • 書き換えアクションとリダイレクト アクションの url 属性
    • CustomResponse アクションの statusLineresponseLine

例 1: 書き換えマップを次のように定義します。

<rewrite>
 <rewriteMaps>
  <rewriteMap name="StaticRewrites" defaultValue="">
    <add key="/diagnostics" value="/default.aspx?tabid=2&amp;subtabid=29" />
    <add key="/webcasts" value="/default.aspx?tabid=2&amp;subtabid=24" />
    <add key="/php" value="/default.aspx?tabid=7116" />
  </rewriteMap>
 </rewriteMaps>
</rewrite>

書き換えルールは次のように定義されています。

<rewrite>
 <rule name="Rewrite Rule">
  <match url=".*" />
  <conditions>
   <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
  </conditions>
  <action type="Rewrite" url="{C:1}"/>
 </rule>
</rewrite>

要求された URL /diagnostic は /default.aspx?tabid=2>subtabid=29 として書き換えられます。
要求された URL /webcasts は /default.aspx?tabid=2>subtabid=24 に 書き換えられます
要求された URL /php は /default.aspx?tabid=7116 に 書き換えられます
書き換えマップに key="/default.aspx" の要素が含まれていないため、要求された URL /default.aspx は書き換えされません。したがって、書き換えマップは条件パターンと一致しない空の文字列を返すため、ルール アクションは実行されません。

例 2: 書き換えマップを次のように定義します。

<rewrite>
 <rewriteMaps>
  <rewriteMap name="StaticRedirects" defaultValue="">
    <add key="/default.aspx?tabid=2&amp;subtabid=29" value="/diagnostics" />
    <add key="/default.aspx?tabid=2&amp;subtabid=24" value="/webcasts" />
    <add key="/default.aspx?tabid=7116" value="/php" />
  </rewriteMap>
 </rewriteMaps>
</rewrite>

書き換えルールは次のように定義されています。

<rewrite>
 <rule name="Redirect rule">
  <match url=".*" />
  <conditions>
   <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
  </conditions>
  <action type="Redirect" url="http://www.contoso.com{C:1}" redirectType="Found" />
 </rule>
</rewrite>

要求された URL /default.aspx?tabid=2>subtabid=29 がにリダイレクトされます http://www.contoso.com/diagnostics
要求された URL /default.aspx?tabid=2>subtabid=24 がにリダイレクトされます http://www.contoso.com/webcasts
要求された URL /default.aspx?tabid=7116 がにリダイレクトされます http://www.contoso.com/php
書き換えマップに key="/default.aspx" の要素が含まれていないため、要求された URL /default.aspx はリダイレクトされません。したがって、書き換えマップは条件パターンと一致しない空の文字列を返すため、ルール アクションは実行されません。