グローバルリライトルールと分散リライトルールの使用

このチュートリアルでは、URL 書き換えモジュールでサポートされるルールのさまざまな種類について説明します。さらに、書き換えのグローバル ルールと分散ルールを構成する方法について説明します。

背景

グローバル書き換えルールを使用して、サーバー全体に及ぶ URL 書き換えロジックを定義します。これらのルールは applicationHost.config ファイル内で定義され、サイトや仮想ディレクトリなどの下位構成レベルでは上書きや無効化ができません。グローバル ルールは、常に絶対 URL パス (つまり、サーバー名を含まない要求された URI) で動作します。たとえば、https://localhost/directory1/directory2/index.html が要求された場合、URL 書き換えモジュールは、グローバル ルールへの入力として "directory1/directory2/index.html" を渡します。

分散書き換えルールは、特定の構成範囲に固有の URL 書き換えロジックを定義するために使用します。分散ルールは、web.config ファイルを使用して、(ファイルを除く) 任意の構成レベルで定義できます。ローカル ルールは常に、そのルールが定義された Web.config ファイルの場所に対する相対 URL で動作します。たとえば、https://localhost/directory1/directory2/index.html が要求され、directory1 にある Web.config ファイルで書き換えルールが定義された場合、URL 書き換えモジュールは、ルールへの入力として "directory2/index.html" を渡します。

グローバル ルール セットは常に最初に評価され、その後、グローバル ルール セットによって生成される URL 文字列を使用して分散ルール セットが評価されます。

前提条件

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

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

チュートリアル シナリオの設定

グローバル ルールおよびローカル ルールの使い方を説明するため、サブドメインをディレクトリにマッピングする一般的なシナリオを実装します。これによって、サブドメインを使用して、サイト上の別のディレクトリ内のコンテンツにアクセスできるようになります。たとえば、http://mysite.com/blog ではなく http://blog.mysite.com に移動したり、http://mysite.com/forum ではなく http://forum.mysite.com に移動したりできるようになります。

このシナリオを設定するには、次の手順を実行します。

1. %SystemDrive%\inetpub\wwwroot\ というフォルダーに、blog および forum という名前の 2 つのフォルダーを作成します。

2. 次の asp.net コードをコピーして、%SystemDrive%\inetpub\wwwroot\blog フォルダーの 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>
      <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>

3. 次の asp.net コードをコピーして、%SystemDrive%\inetpub\wwwroot\forum フォルダーの forum.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>
      <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>

4. %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 書き換え UI でグローバル ルールを作成するには、次の手順を実行します。

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

  2. ナビゲーション ツリー表示からサーバー ノードを選択します。

  3. 機能ビューで [URL Rewrite] モジュールをダブルクリックします。
    Dd939107.fig1_usingglobal(ja-jp,TechNet.10).jpg

  4. [操作] ウィンドウで [Add rules] をクリックします。
    Dd939107.fig2_usingglobal(ja-jp,TechNet.10).jpg

  5. [Add Rules] ダイアログで、[Blank Rule] を選択して [OK] をクリックします。
    Dd939107.fig3_usingglobal(ja-jp,TechNet.10).jpg

ここで実際の書き換えルールを定義する必要があります。URL 書き換えモジュールで、次の 4 つの必須情報を指定して、書き換えルールを定義します。

  • ルールの名前
  • URL 文字列に一致させるために使用するパターン
  • 条件のオプション セット
  • パターンが一致し、すべての条件チェックで問題がない場合に実行するアクション

ルールの名前指定

[名前] テキストボックスに、ルールを一意に識別する名前を入力します (例 : Subdomain mapping)。

パターンの定義

[Pattern] テキストボックスに次の文字列を入力します。

(.*)

この文字列は、空の文字列も含めて任意の URL 文字列にパターンが一致することを指定する正規表現で、逆参照の一致文字列をキャプチャします。

条件の定義

[Add conditions] ボタンをクリックします。

Dd939107.fig4_usingglobal(ja-jp,TechNet.10).jpg

[追加] ボタンをクリックすると、条件を定義するためのダイアログ ボックスが表示されます。

Dd939107.fig5_usingglobal(ja-jp,TechNet.10).jpg
 
[Condition input] に次の文字列「{HTTP_HOST}」を入力します。これによって、URL 書き換えモジュールで、条件に対する入力として HTTP 要求のホスト ヘッダーの値が使用されます。

ドロップダウン コンボ ボックスで [Matches the pattern] を選択します。

[Pattern] テキストボックスに「^([^_]+)_[^_]+」と入力します。この正規表現を使用して、先に作成したドメイン (blog_localhost および forum_localhost) に一致させ、「_」記号の前の文字列部分を逆参照にキャプチャします。たとえば、blog_localhost という文字列の場合、逆参照に blog が保持されます。

すべてのプロパティを指定すると、条件のダイアログ ボックスは次のようになります。

Dd939107.fig6_usingglobal(ja-jp,TechNet.10).jpg

[OK] をクリックして条件を保存し、[Add Rule] に戻ります。

アクションの定義

ここで作成しているルールは URL を書き換えるものなので、[操作] グループ ボックスから [Rewrite] アクション タイプを選択します。[Rewrite URL] テキストボックスに次の文字列を入力します。

{C:1}/{R:1}

この文字列は、入力 URL を何に書き換えるかを指定します。条件 {C:1} に対する逆参照がフォルダーの名前として使用され、ルール {R:1} への逆参照を使用することによって、ルール パターンでキャプチャされたものが保持されます。

他のすべての設定は、既定値のままにします。[Edit Rule] は次のページのようになります。

Dd939107.fig7_usingglobal(ja-jp,TechNet.10).jpg
 
右側の[適用] をクリックしてルールを保存します。

このルールがどのように適用されるかを理解するために、HTTP クライアントが次の URL を要求した場合に URL 書き換えモジュールが実行する手順を見てみましょう。http://blog_localhost/article.aspx?id=323

  1. URL 書き換えモジュールは、入力 URL として article.aspx?id=323 をルールに渡します。ルール パターン マッチに成功し、ルール逆参照 {R:1} でキャプチャします。
  2. ホスト ヘッダー値 (blog_localhost) は、正規表現 ^([^_]+)_[^_]+ への一致に成功します。その結果、条件逆参照 {C:1} で blog がキャプチャされます。
  3. 置換文字列 {C:1}/{R:1} に従って、URL が blog/article.aspx?id=323 に書き換えられます。

ルールのテスト

ルールによって URL が正しく書き換えられることをテストするために、インターネット ブラウザーを開いて URL "http://blog_localhost/article.aspx?id=123" を要求します。

Dd939107.Test global rule(ja-jp,TechNet.10).png

URL 書き換えモジュールによって URL が変更され、blog ディレクトリで Article.aspx ページが開きます。URL 書き換えモジュールによる変更は、ホスト ヘッダーから抽出される情報に基づきます。
 
同様に、http://forum_localhost/forum.aspx?id=345 を要求すると、URL は /forum/forum.aspx?id=345 に書き換えられます。

分散ルールの作成

先ほど作成したグローバル ルールは、ホスト ヘッダーの情報に基づいて、要求をフォルダーにマッピングするために使用しました。次に、分散ルールを作成し、クエリ文字列パラメーターを含まない URL を使用できるようにします。分散ルールは、グローバル ルールによって修正された 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 ファイルを手動で編集してルールを作成します。

分散書き換えルールを作成するには

1. %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}&amp;title={R:2}"/>
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

2. %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}&amp;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 文字列が forum/forum.aspx?topic=some-topic-title&id=123 に書き換えられます。

Dd939107.Test global and local rule(ja-jp,TechNet.10).png

まとめ

このチュートリアルでは、グローバル ルールを使用してサブドメイン マッピング シナリオを実装し、次に分散ルールを使用して、フォルダー内の Web ページに対してユーザー フレンドリーな URL を使えるようにしました。