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

作成者: Ruslan Yakushev

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

背景

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

前提条件

このチュートリアルでは、次の前提条件が必要です。

  1. ASP.NET ロール サービスが有効になっている IIS 7.0 以降
  2. URL Rewrite Go Live リリースがインストールされていること

テスト Web ページの設定

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

次の ASP.NET コードをコピーし、article.aspx という名前のファイルで %SystemDrive%\inetpub\wwwroot\ フォルダー内に配置します。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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>

このファイルをコピーしたら、http://localhost/article.aspx にアクセスし、ページがブラウザーで正しくレンダリングされたことを確認します。

ブラウザーでレンダリングされたテスト ページを示すスクリーンショット。

書き換え用のマップの作成

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

  1. IIS マネージャーに移動します。

  2. [既定の Web サイト] を選択します。

  3. 機能ビューで、[URL 書き換え] をクリックします。
    機能ビューの U R L の書き換えを示すスクリーンショット。

  4. 右側の [操作] ウィンドウで、[書き換えマップの表示...] をクリックします。
    書き換えマップの表示を示すスクリーンショット...

  5. 右側のサイトの [操作] ウィンドウで、[書き換えマップの追加...] をクリックします。次に、書き換えマップの名前を "StaticRewrites" と入力します。
    [マップ名の書き換え] ボックスを示すスクリーンショット。

  6. 新しく作成された書き換えマップのページの右側の [アクション] ウィンドウで、[マッピング エントリの追加] をクリックします。その後、[元の値:] テキスト ボックスに "/article" と入力し、[新しい値:] テキスト ボックスに "/article.aspx?id=1&title=some-title" と入力します。 元の値は、書き換え前の URL パスを指定します。新しい値は、書き換え後の URL パスを指定します。
    [元の値] ボックスと [新しい値] ボックスを示すスクリーンショット。

  7. 手順 6 を繰り返して、次のマッピングを書き換えマップに追加します。

    元の値: 新しい値:
    /some-title /article.aspx?id=1&title=some-title
    /post/some-title.html /article.aspx?id=1&title=some-title

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

<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 つだけになります。 次のセクションでは、この書き換えマップを使用する書き換えルールを作成する方法について説明します。

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

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

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

各ルール要素を見て、それが何をするのかを確認しましょう。
<match url=".*" /> - この要素は、(正規表現の特殊文字 "." を使用して、) 受信 URL に一致するように URL 書き換えモジュールに指示します。

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

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

書き換えのルールのテスト

"StaticRewrites" マップを使用する書き換えルールをテストするには、Web ブラウザーを開き、次のいずれかの URL を要求します。

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

上記のいずれかの URL では、書き換えマップで定義されているマッピングに従って URL が書き換えられます。 結果は以下のページのようになります。

テストの結果を示すスクリーンショット。

リダイレクトに書き換えマップを使用する

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

元の値: 新しい値:
/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="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
    </rule>
</rules>

再び各ルール要素を見て、それが何をするのかを確認しましょう。
<match url=".*" /> - この要素は、(正規表現の特殊文字 "." を使用して、) 受信 URL に一致するように URL 書き換えモジュールに指示します。

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

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

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

"StaticRedirects" マップを使用する書き換えルールをテストするには、Web ブラウザーを開き、次のいずれかの URL を要求します。

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

上記のいずれかの URL を使用すると、ブラウザーが http://localhost/article.aspx?id=1 にリダイレクトされるはずです。

クエリ文字列パラメータに書き換えマップを使用する

書き換えマップの使用は、上記の例に限定されません。 書き換えマップは、書き換えルールの任意の場所で使用できるキーと値のペアのジェネリック コレクションです。 これを説明するために、クエリ文字列パラメータの操作に使用できる書き換えマップを作成してみましょう。

書き換え用のマップの作成」セクションの説明と同じ手順に従って、3 番目の書き換えマップを作成します。 書き換えマップの名前は "IDtoTitleMap" にして、マッピング エントリに次の値を使用します。

元の値: 新しい値:
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>

各ルール要素を見て、それが何をするのかを確認しましょう。
<match url="^article\.aspx$" /> - この要素は、article.aspx ファイルが要求されたときにルールを実行するように URL 書き換えモジュールに指示します。

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

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

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

クエリ文字列のルールのテスト

"IDtoTitleMap" マップを使用する書き換えルールをテストするには、Web ブラウザーを開き、次のいずれかの URL を要求します。

http://localhost/article.aspx?id=1. これは http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2 にリダイレクトされます。 これは http://localhost/article.aspx?title=some-title-2 にリダイレクトされます

まとめ

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

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