次の方法で共有


グローバル書き換えルールと分散書き換えルールの使用

Ruslan Yakushev

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

経歴

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

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

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

前提条件

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

  1. ASP.NET ロール サービスが有効になっている IIS 7.0 以降
  2. URL 書き換え Go Live リリースがインストールされました

ウォークスルー シナリオの設定

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

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

  1. フォルダーに "ブログ" と "フォーラム" という名前の 2 つのフォルダー %SystemDrive%\inetpub\wwwroot\ 作成します。

  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>
    
  3. 次の 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>
    
  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 書き換えモジュール] をクリックします
    WIN 2 K8 R T M ホーム ページのスクリーンショット。[U R L 書き換え] アイコンが強調表示されています。
  4. [アクション] ウィンドウで、[ルールの追加...
    [U R L の書き換え] ページのスクリーンショット。[操作] ウィンドウの [ルールの追加] が強調表示されています。
  5. [ルールの追加] ダイアログで、[空のルール] を選択し、[OK] をクリックします。
    [ルールの追加] ダイアログ ボックスのスクリーンショット。[空のルール] アイコンが選択されています。

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

  • ルールの名前
  • URL 文字列の照合に使用するパターン
  • オプション条件のセット
  • パターンが一致し、すべての条件チェックが成功した場合に実行するアクション

規則の名前付け

[名前] テキスト ボックスに、ルールを一意に識別する名前を入力します (例: "サブドメイン マッピング")。

パターンの定義

[パターン] テキスト ボックスに、次の文字列を入力します。

(.*)

この文字列は、パターンが空の文字列を含む任意の URL 文字列と一致し、一致する文字列をバックリファレンスでキャプチャすることを指定する正規表現です。

条件の定義

[条件の追加] ボタンをクリックします。

[ルールの編集] ページのスクリーンショット。[条件] カテゴリで、[条件の追加] が強調表示されています。

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

[ルールの編集] ページのスクリーンショット。[条件] カテゴリの [追加] ボタンが強調表示されています。
"Condition input:" には、"{HTTP_HOST}" という文字列を入力します。 これにより、条件の入力として http 要求ホスト ヘッダーの値を使用するように URL 書き換えモジュールが構成されます

ドロップダウン コンボ ボックスで、[パターンに一致する] を選択します。

[パターン] ボックスに、「^([^_]+)_[^_]+」と入力します。 この正規表現は、作成したドメイン (blog_localhostとforum_localhost) を照合するために使用され、"_" 記号の前の文字列の一部がバックリファレンスにキャプチャされます。 たとえば、文字列 "blog_localhost" の場合、"blog" はバックリファレンスに保持されます。

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

[条件の編集] ダイアログ ボックスのスクリーンショット。条件入力ボックスに、テキスト角かっこ H T T P アンダースコア HOST 終角かっこが書き込まれます。[大文字と小文字を区別しない] チェック ボックスがオンになっています。

[OK] をクリックして条件を保存し、[ルールの追加] UI に戻ります。

アクションの定義

作成するルールは URL を書き換える必要があるため、[アクション] グループ ボックス内の [書き換え] アクションの種類を選択します。 [書き換え URL:] テキスト ボックスに、次の文字列を入力します。

{C:1}/{R:1}

この文字列は、入力 URL の書き換え対象を指定します。 条件 {C:1} へのバックリファレンスはフォルダーの名前として使用され、ルール パターンでキャプチャされたものは、ルール {R:1} へのバックリファレンスを使用して保持されます。

その他の設定はすべて既定値のままにします。 "ルールの編集" UI は次のページのようになります。

[ルールの編集] ページのスクリーンショット。入力、型、パターンの列はすべてテキストを持ちます。

右側にある [適用] アクションをクリックして、ルールを保存します。

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

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

ルールのテスト

ルールが URL を正しく書き換えるかどうかをテストするには、インターネット ブラウザーを開き、次の URL を要求します。
http://blog_localhost/article.aspx?id=123

[U R L Rewrite Module Test]\(U R L 書き換えモジュールのテスト\) ページのスクリーンショット。サーバー変数の情報と値の情報が表示されます。

URL 書き換えモジュールによって URL が変更され、"blog" ディレクトリのArticle.aspx ページが開かれていることがわかります。 URL 書き換えモジュールによって行われた変更は、ホスト ヘッダーから抽出された情報に基づいて行われました。

同様に、 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 ファイルを手動で編集してルールを作成します。

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

  1. フォルダーに空の web.config ファイル %SystemDrive%\inetpub\wwwroot\**blog** 作成します。 テキスト エディターで開き、次の 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. フォルダーに空の web.config ファイル %SystemDrive%\inetpub\wwwroot\**forum** 作成します。 テキスト エディターで開き、次の 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" に変更されることがわかります。

[U R L Rewrite Module Test]\(U R L 書き換えモジュールのテスト\) ページのスクリーンショット。U R L 文字列が変更されました。

まとめ

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