URL 書き換えモジュールのためのアウトバウンド規則の作成
作成者: Ruslan Yakushev
ドキュメントのこのセクションは、URL Rewrite Module Version 2.0 for IIS 7 に適用されます。
このチュートリアルでは、URL Rewrite Module 2.0 のアウトバウンド書き換え規則を作成してテストする方法について説明します。
前提条件
このチュートリアルでは、次の前提条件が必要です:
- ASP.NET 役割サービスが有効になっている IIS 7.0 以降
- URL Rewrite Module 2.0 RC リリースがインストールされていること
テスト Web ページの設定
URL Rewrite Module 2 がどのように機能するかを示すために、単純な ASP.NET ページを使用します。 このページは、Web サーバー変数を読み取り、ブラウザーでその値を表示します。 また、サーバー変数を使用してハイパーリンクをコンストラクトしてから、そのリンクを応答 HTML 内に挿入します。
テスト ページを作成するには
以下のフォルダーに article.aspx という名前のファイルを作成します。
%SystemDrive%\inetpub\wwwroot\
以下の 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>
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
インバウンド書き換え規則を追加するには:
以下の場所にある web.config ファイルを開きます。
%SystemDrive%\inetpub\wwwroot\
/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>
インバウンド書き換え規則の作成の詳細については、「URL Rewrite Module の書き換えルールを作成する」を参照してください。
インバウンド書き換え規則のテスト
続いて、インバウンド書き換え規則が設計どおりに動作しているかテストできます。
インバウンド書き換え規則をテストするには:
Web ブラウザーを開き、以下の URL を要求します。
http://localhost/article/342/some-article-title
書き換え規則が正しく動作している場合は、以下のような応答がサーバーから返されます。
この応答が返される場合、インバウンド規則のおかげで、シンプルで使いやすい URL 構造体を使用してこの Web ページにアクセスできることを示しています。 しかし、ユーザーが HTML ページ内のハイパーリンクをクリックすると、クエリ文字列パラメータを使用した URL が Web ブラウザーで使用されます。 この事態は、以下の理由から望ましくありません。
- URL 書き換え規則を使用して非表示にしようとしている内部 URL 構造体が、Web サイトの閲覧者に対して表示されます。
- 複数の 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 書き換えユーザー インターフェイスを使用して、アウトバウンド規則を作成します。
アウトバウンド規則を作成するには:
- IIS マネージャーを開きます。
- [既定の Web サイト] を選択します。
- 機能ビューで、[URL 書き換え] を選択します。
- 右側の [操作] ウィンドウで、[ルールの追加...] をクリックします。 [ルールの追加] ダイアログで、[送信ルール] カテゴリの下にある [空のルール] を選択し、[OK] をクリックします。
ここで、実際のアウトバウンドルールを定義する必要があります。 URL Rewrite Module 2.0 では、以下の情報を指定してアウトバウンド書き換えルールを定義します。
- ルールの名前。
- このルールを応答に適用するかどうかを制御する省略可能な前提条件。
- 応答内の文字列の照合に使用するパターン。
- 省略可能な一連の条件。
- パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。
規則の名前付け
[名前] テキスト ボックスに、規則を一意に識別する名前を入力します (例: "書き換えによる URL のクリーン")。
前提条件の定義
前提条件は、応答に対してアウトバウンド規則の評価を実行する必要があるかどうかを評価するために使用されます。 たとえば、HTML コンテンツを変更するルールの場合、コンテンツ タイプ ヘッダーが "text/html" に設定された HTTP 応答のみを、このルールに対して評価する必要があります。 アウトバウンド規則の評価とコンテンツの書き換えは、WEB アプリケーションのパフォーマンスに悪影響を与える可能性のある CPU 負荷の高い操作です。 そのため、前提条件を使用して、アウトバウンド規則が適用されるケースを絞り込みます。
作成する規則は HTML 応答にのみ適用する必要があるため、HTTP 応答ヘッダー コンテンツ タイプが "text/html" と等しいかどうかをチェックする前提条件を定義します。
前提条件を定義するには:
事前条件の一覧で、<[新しい事前条件の作成...]> を選択します。
これにより、[事前条件エディター] ダイアログが表示され、前提条件を定義する必要があります。 前提条件の設定を以下のように指定します:
名前: "IsHTML"
使用: "正規表現"
[追加] をクリックして、[条件の追加] ダイアログを表示します。 このダイアログで、以下の項目を指定します:
条件入力: "{RESPONSE_CONTENT_TYPE}"
入力文字列が "パターンと一致する" かどうかを確認する
パターン: "^text/html"
[OK] をクリックして前提条件を保存し、[ルールの編集] ページに戻ります。
照合するスコープの定義
アウトバウンド書き換えルールは、HTTP ヘッダーのコンテンツまたは応答本文のコンテンツで動作できます。 このルールでは応答のコンテンツ内のリンクを置き換える必要があるため、[照合スコープ] のドロップダウン リストで [応答] を選択します。
タグ フィルターの定義
タグ フィルターを使用すると、応答全体を規則のパターンに対して評価するのではなく、パターン マッチングのスコープを特定の HTML 要素のみにすることができます。 パターン マッチングは非常に CPU 負荷の高い操作なので、応答全体をパターンに対して評価すると Web アプリケーションの応答時間が大幅に遅くなる可能性があります。 タグ フィルターを使用すると、パターン マッチングを特定の HTML タグのコンテンツ内だけに適用するよう指定できるので、正規表現パターンに対して評価する必要があるデータの量を大幅に減らせます。
タグ フィルターを定義するには、[コンテンツの照合範囲:] ドロップダウン リストを展開してから、[A (href 属性)] チェック ボックスをオンにします。
こうすると以下の例のように、ハイパーリンクの href 属性の値だけにパターンを適用するように規則が設定されます。
<a href="this string will be used for pattern matching">Some link</a>
パターンの定義
[パターン] テキスト ボックスに、以下の文字列を入力します。
^/article\.aspx\?id=([0-9]+)(?:&|&)title=([_0-9a-z-]+)$
この文字列は、以下の条件を満たす URL 文字列とパターン マッチングすることを指定する正規表現です。
- 先頭が "/article.aspx?" という文字のシーケンス。
- 最初のクエリ文字列パラメータが数値。
- 2 番目のクエリ文字列パラメータが英数字の値。
正規表現の特定の部分がかっこで囲まれていることに注意してください。 これらのかっこによりキャプチャ グループが作成され、後で規則内で逆参照を使用して参照できます。 また、ほとんどの場合 "&" 記号は応答内で HTML エンコードされるので、正規表現パターンでこのことを考慮する必要があります。
アクションの定義
[アクション] グループ ボックス内の [書き換え] アクションの種類を選択します。 [値] テキスト ボックスに、以下の文字列を入力します。
/article/{R:1}/{R:2}
この文字列は、リンク アドレスの書き換えに使用する新しい値を指定します。 式でクエリ文字列パラメータの値に {R:1} と {R:2} が使用されていることに注意してください。これは、ルール パターン内でかっこを使用して定義したキャプチャ グループへの逆参照です。
その他の設定はすべて既定値のままにします。 [ルールの編集] プロパティ ページは、以下のページのようになります。
右側にある [適用] アクションをクリックして、規則を保存します。
構成ファイル内の書き換え規則の表示
書き換え規則は、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}&title={R:2}" />
</rule>
</rules>
<outboundRules>
<rule name="Rewrite to clean URL" preCondition="IsHTML">
<match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_0-9a-z-]+)$" />
<action type="Rewrite" value="/article/{R:1}/{R:2}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
ルールのテスト
続いて、規則によって URL が正しく書き換えられるかどうかをテストできます。 Web ブラウザーを開き、以下の URL を要求します。
http://localhost/article/342/some-article-title
アウトバウンド書き換え規則により HTML 応答内のリンクが変更されていることがわかります。
これで、サイト閲覧者がこのリンクをクリックすると、クリーンな URL 形式が使用され、このページで使用されていた内部 URL 表現は表示されなくなります。
まとめ
このチュートリアルでは、URL Rewrite Module 2.0 で、IIS マネージャーを使用するか、web.config ファイルを手動で編集して、アウトバウンド書き換え規則を構成する方法について説明しました。 このチュートリアルで作成した規則で、アウトバウンド書き換え、前提条件、タグ フィルターなどの、URL Rewrite Module 2.0 の重要な機能の一部を実演しました。