URL 書き換えモジュールで URL 書き換えマップを使用する

このチュートリアルでは、URL 書き換えモジュールにおける書き換えマップの概念を紹介し、書き換えマップを使用する書き換えルールを作成する方法について説明します。ここでは、2 つの書き換えマップを作成します。1 つのマップは URL 書き換えを実行するルールによって使用され、もう 1 つは、別のドメインへのリダイレクトを実行するルールによって使用されます。

背景

書き換えマップは、書き換えルール内で使用して、書き換え中に置換 URL を生成できる、名前と値の組み合わせの任意のコレクションです。書き換えマップは、大量の書き換えルールが存在し、そのすべてで静的文字列を使用する場合 (つまり、パターン一致を使用しない場合)、特に役に立ちます。このような場合、簡単な書き換えルールを大量に定義する代わりに、入力 URL と置換 URL の間のすべてのマッピングを、"キーおよび値" として書き換えマップに入力します。入力 URL に基づいて置換 URL を検索するには、この書き換えマップを参照する 1 つの書き換えルールを使用すればよいことになります。

前提条件

このチュートリアルは、以下を前提としています。

  1. IIS 7.0 で ASP.NET 役割サービスが有効化されている。
  2. URL の書き換えの Go Live リリースがインストールされている。

テスト Web ページの設定

書き換えマップの機能を説明するために、簡単なテスト用 asp.net ページを使用します。このページでは、Web サーバー変数を読み取って、ブラウザーにそれらの値を出力します。

次の ASP.NET コードをコピーして、%SystemDrive%\inetpub\wwwroot\ フォルダーの article.aspx というファイルに貼り付けます。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>

</body>
</html>

このファイルをコピーした後で、https://localhost/article.aspx を参照して、ページがブラウザーに正しくレンダリングされたことを確認します。

Dd939108.Articleaspx(ja-jp,TechNet.10).png

書き換えに使用するマップの作成

まず、書き換えマップおよび書き換えルールを作成します。これらは、元の URL と書き換えられた URL との間の一連の静的マッピングに基づいて URL 書き換えを実行するために使用されます。書き換えマップを作成するには、次の手順を実行します。

  1. IIS マネージャーに移動します。
  2. [Default Web Site] を選択します。
  3. 機能ビューで [URL Rewrite] をダブルクリックします。
    Dd939108.URL Rewrite Icon(ja-jp,TechNet.10).png
  4. 右側の [操作] ウィンドウで [View rewrite maps] をクリックします。
    Dd939108.ViewRewriteMap(ja-jp,TechNet.10).png
  5. 右側の [操作] ウィンドウで [Add rewrite maps] をクリックし、書き換えマップの名前を「StaticRewrites」と入力します。
    Dd939108.AddRewriteMap(ja-jp,TechNet.10).png
  6. 新しく作成される書き換えマップについてのページが表示されるので、右側の [操作] ウィンドウの [Add mapping entry] をクリックして [Original value] テキストボックスに「/article1」、[New value] テキストボックスに「/article.aspx?id=1&title=some-title」と入力します。元の値は書き換え前の URL パス、新しい値は書き換え後の URL パスを指定します。
      Dd939108.AddMappingEntry(ja-jp,TechNet.10).png
  7. 手順 6 を繰り返し、次のマッピングを書き換えマップに追加します。
    Original Value: New Value:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

自分の Web サイトの web.config ファイル (既定の Web サイトを使用している場合、web.config ファイルは %SystemDrive%\inetpub\wwwroot にあります) を開きます。次のセクションがあるはずです。

<rewrite>
    <rewriteMaps>
        <rewriteMap name="StaticRewrites" defaultValue="">
            <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
        </rewriteMap>
    </rewriteMaps>
</rewrite>

この書き換えマップは、StaticRewrites という名前で、入力 URL (書き換えマップではキーとして定義) を内部用の形式 (値として定義) に書き換えるために使用されます。defaultValue 属性は、入力 URL がマップで定義されていない場合に使用する値を指定します。この場合は、空の文字列が返されます。

キーと値との関係には、明白な共通パターンがありません。つまり、正規表現またはワイルドカードを使用して URL 変換ロジックを定義することはできません。さらに、書き換えマップを使用しないとすると、3 つの書き換えルールを作成しなければならないことになります。書き換えマップを使用すれば、書き換えルールを 1 つ作成するだけで済みます。次のセクションで、この書き換えマップを使用する書き換えルールの作成方法を説明します。

書き換えルールからの書き換えマップの参照

書き換えマップを使用する書き換えルールを作成するには、次の XML コードをコピーして、Web サイトの web.config ファイル内の <rewrite> セクションに貼り付けます。

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

ルールの各要素について理解するために、1 つずつ見ていきましょう。
<match url=".*" /> - この要素は、(正規表現の特殊文字 "." を使用することによって) 任意の入力 URL に対して一致を行うように URL 書き換えモジュールに指示します。

<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)"> - この条件は、書き換えマップ StaticRewrites から返された値が空の文字列でないかどうか確認します。このチェックを実行するために、サーバー変数 REQUEST_URI の値がパラメーターとして書き換えマップに渡されます。書き換えマップに REQUEST_URI と同じキーのエントリが含まれていれば、そのキーに対応する値が返されます。正規表現パターンは空でない文字列にのみ一致するので、マップから空の文字列が返されれば、条件は偽と評価され、書き換えは実行されません。空でない文字列が返された場合、パターンで使用されているかっこによって、その文字列が逆参照でキャプチャされます。

<action type="Rewrite" url="{C:1}" /> - この要素は、URL 書き換えモジュールが、現在の URL 文字列を書き換えマップから抽出された新しい URL 文字列に書き換える必要があることを指定します。url 属性は、条件内のパターンが一致したときに設定された、条件逆参照 {C:1} を参照します。

書き換えルールのテスト

StaticRewrites マップを使用する書き換えルールをテストするために、Web ブラウザーを開いて次の任意の URL を要求します。

https://localhost/article1
https://localhost/some-title
https://localhost/post/some-title.html

これらの URL を指定すると、書き換えマップで定義されたマッピングに従って URL が書き換えられます。その結果、次のページが表示されるはずです。

Dd939108.Test rewrite map rule(ja-jp,TechNet.10).png

リダイレクトについての書き換えマップ

次に、ソース URL とリダイレクト先 URL の間の静的マッピングを定義する、別の書き換えマップを作成します。書き換えマップを作成する手順は、「書き換えに使用するマップの作成」で説明した手順と同じですが、書き換えマップ名は StaticRedirects とし、マッピング エントリとして次の値を使用します。

Original Value: New Value:
/old-article.aspx?id=1 /article.aspx?id=1
/posts/default.aspx?id=1 /article.aspx?id=1
/old-title.html /article.aspx?id=1

これで、Web サイトの web.config ファイルには、次の 2 つの書き換えマップが含まれているはずです。

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
</rewriteMaps>

StaticRedirects 書き換えマップを使用するルールを作成するには、次のルール定義をコピーして Web サイトの web.config ファイルに貼り付けます。

<rules>
    <rule name="Redirect Rule" stopProcessing="true">
        <match url=".*" />
        <conditions>
            <add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="https://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

もう一度、ルールの各要素について理解するために、1 つずつ見ていきましょう。
<match url=".*" /> - この要素は、(正規表現の特殊文字 "." を使用することによって) 任意の入力 URL に対して一致を行うように URL 書き換えモジュールに指示します。

<add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)"> - この条件は、書き換えマップ StaticRedirects から返された値が空の文字列でないかどうか確認します。このチェックを実行するために、サーバー変数 REQUEST_URI の値がパラメーターとして書き換えマップに渡されます。書き換えマップに REQUEST_URI と同じキーのエントリが含まれていれば、そのキーに対応する値が返されます。正規表現パターンは空でない文字列にのみ一致するので、マップから空の文字列が返されれば、条件は偽と評価され、書き換えは実行されません。空でない文字列が返された場合、パターンで使用されているかっこによって、その文字列が逆参照でキャプチャされます。

<action type="Redirect" url="https://localhost{C:1}" appendQueryString="False" redirectType="Permanent" /> - この要素は、URL 書き換えモジュールが、新しいドメイン名 (この場合は簡素化するために同じドメイン) と StaticRedirects マップから返されたリダイレクト先の URL パスを連結して構築される新しい URL に、Web クライアントをリダイレクトする必要があることを指定します。

リダイレクト ルールのテスト

StaticRedirects マップを使用する書き換えルールをテストするために、Web ブラウザーを開いて次の任意の URL を要求します。

https://localhost/old-article.aspx?id=1
https://localhost/posts/default.aspx?id=1
https://localhost/old-title.html

上記のどの URL を要求しても、ブラウザーは https://localhost/article.aspx?id=1 にリダイレクトされます。

クエリ文字列パラメーターについての書き換えマップ

書き換えマップの用途は、前述の例に限られるわけではありません。書き換えマップはキーと値のペアの一般的なコレクションであり、書き換えルールの任意の場所で使用できます。このことを説明するために、クエリ文字列パラメーターの操作に使用する書き換えマップを作成してみましょう。

「書き換えに使用するマップの作成」で説明した手順に従って、3 つ目の書き換えマップを作成します。書き換えマップの名前は IDtoTitleMap とし、マッピングのエントリとして次の値を使用します。

Original Value: New Value:
1 some-title-1
2 some-title-2
3 some-title-3

これで、Web サイトの web.config ファイルには、次の 2 つの書き換えマップが含まれているはずです。

<rewriteMaps>
    <rewriteMap name="StaticRewrites">
        <add key="/article1" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;title=some-title" />
    </rewriteMap>
    <rewriteMap name="StaticRedirects">
        <add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
        <add key="/old-title.html" value="/article.aspx?id=1" />
    </rewriteMap>
    <rewriteMap name="IDtoTitleMap">
        <add key="1" value="some-title-1" />
        <add key="2" value="some-title-2" />
        <add key="3" value="some-title-3" />
    </rewriteMap>
</rewriteMaps>

IDtoTitleMap 書き換えマップを使用するルールを作成するには、次のルール定義をコピーして Web サイトの web.config ファイルに貼り付けます。

<rules>
    <rule name="Query String Rule" stopProcessing="true">
        <match url="^article\.aspx$" />
        <conditions>
            <add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
            <add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
        </conditions>
        <action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" 
                                                            redirectType="Permanent" />
    </rule>
</rules>

ルールの各要素について理解するために、1 つずつ見ていきましょう。
<match url="^article\.aspx$" /> - この要素は、URL 書き換えモジュールに、article.aspx ファイルが要求された場合にはルールを実行するように指示します。

<add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" /> - この条件は、数値を持つパラメーター id がクエリ文字列に含まれているかどうか確認します。実際の値は、条件逆参照でキャプチャされます。このパターンは、クエリ文字列にその他のパラメーターが含まれている場合でも動作します。

<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" /> - この条件は、書き換えマップ IDtoTitleMap から返された値が空の文字列でないかどうか確認します。この条件は、書き換えマップへの入力として、前の条件パターンからの逆参照を使用します。

<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" /> - この要素は、URL 書き換えモジュールが、別のクエリ文字列パラメーター title (書き換えマップで検索された値を含む) を使用して article.aspx ファイルに Web クライアントをリダイレクトする必要があることを指定します。

クエリ文字列についてのルールのテスト

IDtoTitleMap マップを使用する書き換えルールをテストするために、Web ブラウザーを開いて次の任意の URL を要求します。 https://localhost/article.aspx?id=1。これは https://localhost/article.aspx?title=some-title-1 にリダイレクトされます。 https://localhost/article.aspx?someparam=somevalue&id;=2。これは https://localhost/article.aspx?title=some-title-2 にリダイレクトされます。

まとめ

ここでは、書き換えマップを使用して書き換えルールおよびリダイレクト ルールに使用する URL マッピングを定義する方法を学びました。また、書き換えマップを使用してクエリ文字列パラメーターを操作する方法についても学びました。

URL の書き換えおよびリダイレクトが静的であり、書き換えロジックをパターン マッチで表せない場合、書き換えマップを使用することによって書き換えルールの数を減らすことができます。