グローバルおよび分散書き換えルールの使用
このチュートリアルでは、URL Rewrite Module でサポートされるさまざまな種類のルールについて説明し、グローバルおよび分散書き換えルールを構成する方法を説明します。
背景
グローバル書き換えルールは、サーバー全体の URL 書き換えロジックを定義するために使用されます。 これらのルールは applicationHost.config ファイル内で定義されており、サイトや仮想ディレクトリなどの下位の構成レベルでオーバーライドしたり無効にしたりすることはできません。 グローバル ルールは、常に絶対 URL パス (つまり、サーバー名なしで要求された URI) に影響します。 たとえば、要求が http://localhost/directory1/directory2/index.html
に対して行われた場合、URL Rewrite Module によって "directory1/directory2/index.html" が入力としてグローバル ルールに渡されます。
分散書き換えルールは、特定の構成スコープに固有の URL 書き換えロジックを定義するために使用されます。 分散ルールは、web.config ファイルを使用して任意の構成レベル (ファイルを除く) で定義できます。 ローカル ルールは、それらが定義されている Web.config ファイルの場所を基準とした URL に対して常に影響します。 たとえば、http://localhost/directory1/directory2/index.html
への要求が行われ、directory1 にある Web.config ファイルで書き換えルールが定義されている場合、URL Rewrite Module によって "directory2/index.html" が入力としてそのルールに渡されます。
グローバル ルール セットは常に最初に評価され、その後、グローバル ルール セットによって生成された URL 文字列を使用して分散ルール セットが評価されます。
前提条件
このチュートリアルでは、次の前提条件が必要です。
- ASP.NET ロール サービスが有効になっている IIS 7.0 以降
- URL Rewrite Go Live リリースがインストールされていること
チュートリアル シナリオの設定
グローバルとローカルのルールの使用方法を示すために、サブドメインをディレクトリにマッピングする一般的なシナリオを実装します。 これにより、サブドメインを使用してサイト上のさまざまなディレクトリのコンテンツにアクセスできるようになります。 たとえば、ユーザーは http://mysite.com/blog
の代わりに http://blog.mysite.com
を参照したり、http://mysite.com/forum
の代わりに http://forum.mysite.com
を参照したりできます。
シナリオを設定するには、次の手順を実行します。
%SystemDrive%\inetpub\wwwroot\
フォルダーに "blog" と "forum" という名前の 2 つのフォルダーを作成します。次の asp.net コードをコピーし、article.aspx という名前のファイル内の
%SystemDrive%\inetpub\wwwroot\blog
フォルダーに配置します。<%@ 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> <p>This page is located in blog subdomain.</p> <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>
次の asp.net コードをコピーし、forum.aspx という名前のファイル内の
%SystemDrive%\inetpub\wwwroot\forum
フォルダーに配置します。<%@ 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> <p>This page is located in forum subdomain.</p> <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>
%SystemDrive%\windows\system32\drivers\etc\
にある "hosts" という名前のファイルを開き、次の 2 行を追加します。127.0.0.1 forum_localhost 127.0.0.1 blog_localhost
これらの行を追加したら、Web ブラウザーを開いて http://blog_localhost/blog/article.aspx および http://forum_localhost/forum/forum.aspx にアクセスし、ページがブラウザーで正しくレンダリングされたことを確認します。
グローバル書き換えルールの作成
まず、ホスト ヘッダーに基づいて URL を書き換えるグローバル書き換えルールを作成します。 たとえば、http://blog_localhost/article.aspx に対して要求が行われた場合、そのルールによって URL パスが "/blog/article.aspx" に変更されます。
IIS マネージャーで URL Rewrite UI を使用してグローバル ルールを作成するには、次の手順に従います。
- IIS マネージャーに移動します。
- ナビゲーション ツリー ビューで、サーバー ノードを選びます。
- 機能ビューで、[URL Rewrite Module] をクリックします。
- [アクション] ペインで、[ルールの追加] をクリックします。
- [ルールの追加] ダイアログで、[空のルール] を選び、[OK] をクリックします。
ここで、実際の書き換えルールを定義する必要があります。 URL Rewrite Module では、次の 4 つの重要な情報を指定して書き換えルールを定義します。
- 規則の名前
- URL 文字列の照合に使用するパターン
- 省略可能な一連の条件
- パターンが一致し、すべての条件チェックが成功した場合に実行するアクション
ルールの名前付け
[名前] テキスト ボックスに、ルールを一意に識別する名前 ("サブドメイン マッピング" など) を入力します。
パターンの定義
[パターン] テキスト ボックスに、次の文字列を入力します。
(.*)
この文字列は、パターンが空の文字列を含む任意の URL 文字列と一致し、一致した文字列を前方参照でキャプチャすることを指定する正規表現です。
条件の定義
[条件の追加] ボタンをクリックします。
[追加] ボタンをクリックして、条件を定義するためのダイアログ ボックスを表示します。
"条件入力:" には、"{HTTP_HOST}" という文字列を入力します。 これにより、条件の入力として http 要求ホスト ヘッダーの値を使用するように URL Rewrite Module が構成されます。
ドロップダウン コンボ ボックスで、[パターンに一致する] を選びます。
[パターン] テキストボックスに、「^([^_]+)_[^_]+」と入力します。 この正規表現は、作成したドメイン (blog_localhost および forum_localhost) と照合するために使用され、"_" 記号の前の文字列の一部を前方参照にキャプチャします。 たとえば、文字列 "blog_localhost" の場合、"blog" が前方参照に保持されます。
すべてのプロパティを指定すると、条件ダイアログは次のようになります。
[OK] をクリックして条件を保存し、[ルールの追加] UI に戻ります。
アクションの定義
作成しているルールは URL を書き換えることを目的としているため、[アクション] グループ ボックス内の [書き換え] アクションの種類を選びます。 [書き換え URL:] テキスト ボックスに、次の文字列を入力します。
{C:1}/{R:1}
この文字列は、入力 URL の書き換え先を指定します。 条件 {C:1} への前方参照はフォルダーの名前として使用され、ルール パターンでキャプチャされたものはすべて、ルール {R:1} への前方参照を使用して保持されます。
その他の設定はすべて既定値のままにします。 [ルールの編集] UI は次のページのようになります。
右側にある [適用] アクションをクリックして、ルールを保存します。
このルールがどのように適用されるかを理解するために、HTTP クライアントが次の URL を要求したときに URL Rewrite Module によって実行される手順を見てみましょう。
http://blog_localhost/article.aspx?id=323
:
- URL Rewrite Module は、入力 URL として "article.aspx?id=323" をルールへ渡し、それがルール パターンに合致し、ルールの前方参照 {R:1} でキャプチャします
- ホスト ヘッダー値 ("blog_localhost") は正規表現 "^([^_]+)_[^_]+" に合致し、結果として "blog" が条件前方参照 {C:1} にキャプチャされます
- 置換文字列 {C:1}/{R:1} に従って、URL が "blog/article.aspx?id=323" に書き換えられます。
ルールのテスト
ルールによって URL が正しく書き換えられるかどうかをテストするには、インターネット ブラウザーを開き、次の URL を要求します。
http://blog_localhost/article.aspx?id=123
URL Rewrite Module によって URL が変更され、"blog" ディレクトリに Article.aspx ページが開かれたことがわかります。 URL Rewrite Module によって行われた変更は、ホスト ヘッダーから抽出された情報に基づいて行われました。
同様に、http://forum_localhost/forum.aspx?id=345
を要求すると、その URL は /forum/forum.aspx?id=345 に書き換えられます。
分散ルールの作成
先ほど作成したグローバル ルールは、ホスト ヘッダーから抽出された情報に基づいて要求をフォルダーにマップするために使用されました。 次に、クエリ文字列パラメータなしで URL を使用できるようにする分散ルールを作成します。 分散ルールは、グローバル ルールによって既に変更された URL を入力として受け取り、それに追加の変更を実行します。 特に次の点に違いがあります。
- "blog" フォルダー内の書き換えルールにより、URL パスが "article/234/some-title" から "article.aspx?id=234>title=some-title" に書き換えられます
- "forum" フォルダーの書き換えルールにより、URL パスが "topic/123/some-topic-title" から "forum.aspx?topic=some-topic-title&id=123" に書き換えられます
ローカル ルールは、IIS マネージャーを使用するか、web.config ファイルを編集して作成できます。 デモンストレーションの目的で、web.config ファイルを手動で編集してルールを作成します。
分散書き換えルールを作成するには:
%SystemDrive%\inetpub\wwwroot\**blog**
フォルダーに空の web.config ファイルを作成します。 それをテキスト エディターで開き、次の XML コードを貼り付けます。<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to article.aspx"> <match url="^article/([0-9]+)/([_0-9a-z-]+)"/> <action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
%SystemDrive%\inetpub\wwwroot\**forum**
フォルダーに空の web.config ファイルを作成します。 それをテキスト エディターで開き、次の XML コードを貼り付けます。<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Rewrite to forum.aspx"> <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/> <action type="Rewrite" url="forum.aspx?topic={R:2}&id={R:1}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
グローバルと分散の両方のルールのテスト
すべてのルールが正しく連携して動作することをテストするには、Web ブラウザーを開いて http://blog_localhost/article/234/some-title
に要求を行います。 ブラウザーの応答には、URL が最初にグローバル ルールによって変更された後、分散ルールによってさらに変更されたことが示されます。
同様に、http://forum_localhost/topic/123/some-topic-title
を要求した場合、要求された URL 文字列が URL Rewrite Module によって "/forum/forum.aspx?topic=some-topic-title&id=123" に変更されることが示されます。
まとめ
このチュートリアルでは、グローバル ルールを使用してサブドメイン マッピング シナリオを実装し、分散ルールを使用してこれらのフォルダー内の Web ページのユーザー フレンドリ URL を有効にしました。