URL 書き換えモジュールで URL 書き換えマップを使用する
このチュートリアルでは、URL 書き換えモジュールにおける書き換えマップの概念を紹介し、書き換えマップを使用する書き換えルールを作成する方法について説明します。ここでは、2 つの書き換えマップを作成します。1 つのマップは URL 書き換えを実行するルールによって使用され、もう 1 つは、別のドメインへのリダイレクトを実行するルールによって使用されます。
背景
書き換えマップは、書き換えルール内で使用して、書き換え中に置換 URL を生成できる、名前と値の組み合わせの任意のコレクションです。書き換えマップは、大量の書き換えルールが存在し、そのすべてで静的文字列を使用する場合 (つまり、パターン一致を使用しない場合)、特に役に立ちます。このような場合、簡単な書き換えルールを大量に定義する代わりに、入力 URL と置換 URL の間のすべてのマッピングを、"キーおよび値" として書き換えマップに入力します。入力 URL に基づいて置換 URL を検索するには、この書き換えマップを参照する 1 つの書き換えルールを使用すればよいことになります。
前提条件
このチュートリアルは、以下を前提としています。
- IIS 7.0 で ASP.NET 役割サービスが有効化されている。
- 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 を参照して、ページがブラウザーに正しくレンダリングされたことを確認します。
書き換えに使用するマップの作成
まず、書き換えマップおよび書き換えルールを作成します。これらは、元の URL と書き換えられた URL との間の一連の静的マッピングに基づいて URL 書き換えを実行するために使用されます。書き換えマップを作成するには、次の手順を実行します。
- IIS マネージャーに移動します。
- [Default Web Site] を選択します。
- 機能ビューで [URL Rewrite] をダブルクリックします。
- 右側の [操作] ウィンドウで [View rewrite maps] をクリックします。
- 右側の [操作] ウィンドウで [Add rewrite maps] をクリックし、書き換えマップの名前を「StaticRewrites」と入力します。
- 新しく作成される書き換えマップについてのページが表示されるので、右側の [操作] ウィンドウの [Add mapping entry] をクリックして [Original value] テキストボックスに「/article1」、[New value] テキストボックスに「/article.aspx?id=1&title=some-title」と入力します。元の値は書き換え前の URL パス、新しい値は書き換え後の URL パスを指定します。
- 手順 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&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&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 が書き換えられます。その結果、次のページが表示されるはずです。
リダイレクトについての書き換えマップ
次に、ソース 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&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&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&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&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 の書き換えおよびリダイレクトが静的であり、書き換えロジックをパターン マッチで表せない場合、書き換えマップを使用することによって書き換えルールの数を減らすことができます。