URL 書き換えモジュールの送信ルールの作成

公開日: 2009 年 7 月 16 日 (作業者: ruslany (英語))

更新日: 2009 年 9 月 9 日 (作業者: ruslany (英語))

必要条件

このチュートリアルの必要条件は次のとおりです。

  1. ASP.NET 役割サービスを含む IIS 7 が有効になっている
  2. URL 書き換えモジュール 2.0 ベータ版のリリースがインストールされている

テスト Web ページを設定する

URL 書き換えモジュール 2 がどのように動作するかを確認するために、シンプルな ASP.NET ページを使用します。 このページは、Web サーバー変数を読み取り、その値をブラウザーに表示します。 また、このページはサーバー変数を使用してハイパーリンクを構築してから、そのリンクを応答 HTML に組み込みます。

テスト ページを作成するには

  1. 次のフォルダーに、article.aspx という名前のファイルを作成します。

    %SystemDrive%\inetpub\wwwroot\
    
  2. 次の ASP.NET マークアップをコピーしてファイルに貼り付け、そのファイルを保存します。

    <%@ 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 v2 Test</title> 
     </head> 
     <body> 
         <h1>URL Rewrite Module v2 Test Page</h1> 
         <h2>Inbound URL Rewriting</h2> 
         <table> 
             <tr> 
                 <th>Server Variable</th> 
                 <th>Value</th> 
             </tr> 
             <tr> 
                 <td>Original URL: </td> 
                 <td><%= Request.ServerVariables["UNENCODED_URL"] %></td> 
             </tr> 
             <tr> 
                 <td>Final URL: </td> 
                 <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td> 
             </tr> 
         </table> 
    
         <h2>Outbound URL Rewriting</h2> 
             <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article. 
     </body> 
     </html>
    
  3. このページが正しくレンダリングされることを確認するために、Web ブラウザーを開いて次の URL を要求します。

    http://localhost/article.aspx
    

受信書き換え規則を追加する

次のステップは、次の形式を持つ URL を書き換える規則を追加することです。

http://localhost/article/342/some-article-title

これらの URL は、次のような形式に書き換えられます。

http://localhost/article.aspx?id=342&title=some-article-title

受信書き換え規則を追加するには

  1. 次の場所にある web.config ファイルを開きます。

    %SystemDrive%\inetpub\wwwroot\
    
  2. /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>
    

受信書き換え規則の作成方法の詳細については、URL 書き換えモジュール用の書き換えルールの作成 を参照してください。

受信書き換え規則をテストする

この段階で、受信書き換え規則が設計どおりに動作するかどうかをテストできます。

受信書き換え規則をテストするには

Web ブラウザーを開き、次の URL を要求します。

http://localhost/article/342/some-article-title

書き換え規則が正しく動作していると、サーバーからの応答は次のようになります。

Ee890818.CreateOutboundRules1(ja-jp,TechNet.10).png

このように表示されるのは、受信規則が機能しているからです。シンプルでユーザーにわかりやすい URL 構造を使用して、この Web ページにアクセスできます。 ただし、ユーザーが HTML ページ内でこのハイパーリンクをクリックすると、Web ブラウザーではクエリ文字列パラメーター付きの URL が使用されます。 以下のような理由で、これは好ましくありません。

  1. URL 書き換え規則を使用して非表示にしていた内部 URL 構造が Web サイトの訪問者に対して表示されます。
  2. 同じページにアクセスする複数の URL が存在します。これは、検索エンジンの最適化にとって理想的ではありません。

この状態を修正するには、HTML ページで単純なリンク構造を使用するように変更するのが最も簡単です。 しかし、ほとんどの場合、この方法をとることはできません。 たとえば、複雑なレガシー Web アプリケーションや変更できない Web アプリケーションが既に存在している場合、アプリケーション内のすべての URL リンクを修正する作業は、長い時間がかかったり、実際上不可能だったりすることがあります。

この状況では、送信 URL の書き換えが役立ちます。 送信 URL の書き換えを使用すると、アプリケーションが生成した応答をその場で修正できます。

送信書き換え規則を作成する

ここでは、HTML 応答内の URL を変更する送信書き換え規則を作成します。 この規則は、次の形式を持つ URL を変更します。

http://localhost/article.aspx?id=342&title=some-article-title

これらの URL は、次のように書き換えられます。

http://localhost/article/342/some-article-title

IIS マネージャー内の URL 書き換えユーザー インターフェイスを使用して、送信規則を作成します。

送信規則を作成するには

  1. IIS マネージャーを開きます。
  2. [Default Web Site] を選択します。
  3. 機能ビューで、[URL 書き換え] を選択します。
    Ee890818.URLRewriteIcon2(ja-jp,TechNet.10).png
  4. 右側の [操作] ウィンドウで、[ 規則の追加... ] をクリックします。 [規則の追加] ダイアログで、[送信規則] カテゴリの下にある [空の規則] を選択して、[OK] をクリックします。
    Ee890818.AddOutboundRule(ja-jp,TechNet.10).png

ここで、実際の送信規則を定義します。 URL 書き換えモジュール 2.0 では、送信書き換え規則は次の情報を指定して定義されます。

  • 規則の名前。
  • この規則を応答に適用する必要があるかどうかを制御する前提条件 (オプション)。
  • 応答内の文字列の照合に使用するパターン。
  • オプションの条件セット。
  • パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。

規則の名前付け

[名前] テキスト ボックスに、「クリーンな URL への書き換え」など、規則を一意に識別できる名前を入力します。

前提条件の定義

前提条件を使用して、応答に送信規則の評価を実行する必要があるかどうかを評価します。 たとえば、HTML コンテンツを変更する規則の場合、content-type ヘッダーが "text/html" に設定されている HTTP 応答のみ、この規則に対して評価される必要があります。 送信規則の評価およびコンテンツの書き換え操作は、CPU を集中的に使用するので、Web アプリケーションのパフォーマンスに悪影響を及ぼす場合があります。 そのため、前提条件を使用して、送信規則が適用される場合の絞り込みを行います。

作成する規則は、HTML 応答にのみ適用する必要があるため、HTTP 応答のヘッダーの content-type が "text/html" であるかどうかを確認する前提条件を定義します。

前提条件を定義するには

  1. [前提条件] リストで、[<新しい前提条件の作成>] を選択します。
  2. [前提条件エディター] ダイアログが表示されるので、ここで前提条件を定義します。 前提条件設定を次のように指定します。
    • [名前:] 「 HTML のみ 」
    • [使用:] 「 正規表現 」
    • [追加] をクリックすると、[条件の追加] ダイアログが表示されます。 このダイアログで、次のように指定します。
      • [条件入力:] 「 {HTTP_CONTENT_TYPE} 」
      • [入力文字列のチェック:] 「 パターンに一致する 」
      • [パターン:] 「 ^text/html 」
        Ee890818.HTMLPrecondition(ja-jp,TechNet.10).png
  3. [OK] をクリックして前提条件を保存し、[規則の編集] ページに戻ります。

パターンの定義

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

^/article\.aspx\?id=([0-9]+)&title=([_0-9a-z-]+)$

この文字列は、以下の条件を満たすすべての URL 文字列と一致するパターンの正規表現です。

  • 文字列が「/article.aspx?」で始まる。
  • その中の最初のクエリ文字列パラメーターに数字が含まれている。
  • その中の 2 番目のクエリ文字列パラメーターに英数字が含まれている。

正規表現の特定の部分が、かっこで囲まれていることに注目してください。 これらのかっこは、後方参照を使用して規則内で後で参照できるキャプチャ グループを作成しています。

タグ フィルターの定義

タグ フィルターを使用すると、応答全体を規則のパターンに対して評価せずに、パターン マッチングを特定の HTML 要素のみに絞り込むことができます。 パターン マッチングは、CPU に大きな負荷がかかる操作なので、応答全体をパターンに対して評価すると、Web アプリケーションの応答時間が長くなることがあります。 タグ フィルターを使用すると、特定の HTML タグ内に対してのみパターン マッチングを適用するように指定できるので、正規表現パターンに対して評価する必要のあるデータ量は大幅に少なくなります。

タグ フィルターを定義するには、[ 次のタグ内のコンテンツに一致する: ] ドロップダウン リストを展開して、[ A (href 属性) ] チェック ボックスをオンにします。

こうすることで、この規則は、次の例に示すようなハイパーリンクの href 属性の値に対してのみパターンを適用します。

<a href="this string will be used for pattern matching">Some link</a>

アクションの定義

[アクション] グループ ボックスの [アクションの種類] で [書き換え] を選択します。 [値] テキスト ボックスに、次の文字列を入力します。

/article/{R:1}/{R:2}

この文字列には、リンク アドレスを書き換える新しい値を指定します。 クエリ文字列パラメーターの値に対して、表現 {R:1} および {R:2} が使用されていることに注目してください。これらは、かっこを使用して規則パターン内に定義したキャプチャ グループへの後方参照です。

他のすべての設定は、既定の値のままにします。 [規則の編集] プロパティ ページは、次のページのように設定します。

Ee890818.CreateOutboundRules111(ja-jp,TechNet.10).png

右側の [適用] アクションをクリックして、規則を保存します。

構成ファイル内の書き換え規則を表示する

書き換え規則は、 aplicationHost.config ファイルまたは web.config ファイルに保存されます。 作成した規則の構成を確認するには、次の場所にある web.config ファイルを開きます。

%SystemDrive%\inetput\wwwroot\

このファイルで、次の例のような、すべての規則の定義が含まれている <rewrite> セクションを確認できます。

<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> 
     <outboundRules> 
         <preConditions> 
             <preCondition name="HTML Only"> 
                 <add input="{HTTP_CONTENT_TYPE}" pattern="^text/html" /> 
             </preCondition> 
         </preConditions> 
         <rule name="rewrite to clean url" preCondition="HTML Only"> 
             <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)&amp;title=([_0-9a-z-]+)$" /> 
             <action type="Rewrite" value="/article/{R:1}/{R:2}" /> 
         </rule> 
     </outboundRules> 
 </rewrite>

規則のテスト

ここで、規則が URL を正しく書き換えているかどうかをテストできます。 Web ブラウザーを開き、次の URL を要求します。

http://localhost/article/342/some-article-title

送信書き換え規則によって、HTML 応答内のリンクが変更されていることがわかります。

Ee890818.CreateOutboundRules2(ja-jp,TechNet.10).png

サイトの訪問者がこのリンクをクリックすると、クリーンな URL 形式が使用され、このページで使用されている内部 URL は表示されません。

まとめ

このチュートリアルでは、IIS マネージャーを使用するか、 web.config ファイルを手動で編集して、URL 書き換えモジュール 2.0 内の送信書き換え規則を構成する方法を学びました。 このチュートリアルで作成した規則で、送信書き換え、前提条件、タグ フィルターなど、URL Rewrite Module 2.0 の重要な機能のいくつかを実践しました。

関連コンテンツ

記事