IIS URL の書き換えと ASP.NET ルーティング
公開日: 2008 年 9 月 4 日 (作業者: ruslany (英語))
更新日: 2009 年 5 月 27 日 (作業者: ruslany (英語))
IIS URL の書き換え
URL の書き換えは一般に新しい概念ではありません。 この機能は約 10 年前に Apache Web サーバーに導入され、 それ以来、Web サーバー管理者と Web 開発者にとって便利なツールとしての地位を確立してきました。 Apache でホストされる多くの有名なアプリケーションが、"クリーンな" URL をサポートするために、URL の書き換えに依存するようになっています。
一言で言えば、URL の書き換えという概念はシンプルです。 クライアントが特定の URL の要求を Web サーバーに送信すると、要求された URL を URL 書き換えコンポーネントが分析し、同一サーバー上の別の URL に変更します。 要求処理パイプラインのかなり早い段階で URL 書き換えコンポーネントが実行されるので、Web サーバーが要求の処理に使用するハンドラーを決定する前に、要求された URL を変更できます。 次に、書き換えられた URL に基づいてハンドラーが選択され、そのハンドラーが要求を処理し、Web ブラウザーへの応答を生成します。 要求を送信したクライアントからは、書き換えられた URL は見えません。クライアントからは、送信した元の URL から応答を受信したように見えます。
IIS 7.0 アーキテクチャでは、この処理は次の図のようになります。
URL 書き換えモジュールは、要求の処理パイプラインの要求の開始前 (Pre-begin Request) または要求の開始 (Begin Request) の部分に組み込まれるネイティブ コード モジュールです。 各書き換えルールは URL パスを分析し、すべてのルール条件が満たされたら、元のパスを新しいパスに変更します。 すべてのルールが評価された後で、URL 書き換えモジュールは、残りの IIS パイプライン処理でその要求に使用される最終的な URL パスを生成します。 これは、IIS パイプラインにおけるハンドラー選択が、URL 書き換えモジュールによって書き換えられた URL に基づいて行われることを意味します。
ASP.NET ルーティング
ASP.NET ルーティングとは本質的に、特定の URL とその URL に対する要求を処理できるハンドラーを関連付けできるようにするための要求ディスパッチ メカニズムです。 この関連付けは、特定の URL パスに対して呼び出すハンドラーを定義する "ルート" を登録することによって行います。 Web サーバーに対して要求が行われると、ASP.NET ルーティングは、登録されたルートの一覧の中で要求された URL パスを探します ルートが見つかった場合は、要求を処理するために、そのルートに対応するハンドラーが呼び出されます。
IIS 7.0 と ASP.NET のアーキテクチャでは、この処理は次の図のようになります。
ASP.NET ルーティングは、IIS 要求処理パイプラインのキャッシュの解決 (Resolve Cache) 段階 (PostResolveRequestCache) およびハンドラーのマッピング (Map Handler) 段階 (PostMapRequestHandler) に組み込まれるマネージ コード モジュールとして実装されています。 ASP.NET ルーティングは、Web アプリケーションに対するすべての要求に対して実行されるように構成されています。
PostResolveRequestCache イベントの間、このモジュールはルーティング テーブル (ルート オブジェクトのコレクション) を調べて、要求された URL パスに一致するルートを探します。 一致が見つかった場合は、モジュールはそのルートに対応するハンドラーへの参照を取得し、その参照を現在の HTTP コンテキストの一部として保存します。 ハンドラーとして、System.Web.IHttpHandler を実装する任意の .NET Framework オブジェクトを使用できます。 ルートが見つからなかった場合は、モジュールは何も行わず、URL はそのまま通過して普通に (一般的には URL に一致するディクス上のファイルを探して) 処理されます。
PostMapRequestHandler イベントの間に、モジュールは、ハンドラーについての情報が HTTP コンテキストに含まれているかどうかを確認します。 含まれている場合、ASP.NET ルーティングはその情報を使用して、現在の HTTP コンテキストのハンドラー プロパティを設定します。 こうすることで、ハンドラーの実行 (Execute Handler) 段階で、ルーティング モジュールで選択されたハンドラーを IIS が実行するようになります。 この情報が設定されていない場合、モジュールは何も行わず、URL はそのまま通過して、ハンドラーの選択は IIS に任されます。
URL の書き換えと ASP.NET ルーティングの違い
上記の説明から、URL の書き換えと ASP.NET ルーティングの概念の主な違いは以下のとおりです。
- URL の書き換えは、要求が Web サーバーによって処理される前に、URL パスを操作するために使用されます。 URL 書き換えモジュールでは、書き換えられた URL を最終的に処理するハンドラーはわかりません。 また、実際に要求を処理するハンドラーでは、URL が書き換えられたことを認識していない場合があります。
- ASP.NET ルーティングは、要求された URL パスに基づいて、要求をハンドラーにディスパッチするために使用されます。 URL の書き換えとは反対に、ルーティング コンポーネントではハンドラーを把握し、要求された URL に対する応答を生成するハンドラーを選択します。 ASP.NET ルーティングは高度なハンドラー マッピング メカニズムと見なすことができます。
IIS の URL の書き換えと ASP.NET ルーティングの間には、これらの概念の違いに加えて以下に示す機能上の違いがあります。
- IIS URL 書き換えモジュールは、ASP.NET、PHP、ASP、静的ファイルをはじめとする任意の種類の Web アプリケーションで使用できます。 ASP.NET ルーティングは、.NET Framework に基づく Web アプリケーションでのみ使用できます。
- IIS URL 書き換えモジュールは、アプリケーション プールに使用される IIS のパイプラインが統合モードでもクラシック モードでも機能します。 ASP.NET ルーティングでは、統合パイプライン モードが推奨されます。 ASP.NET ルーティングはクラシック モードでも動作しますが、その場合、アプリケーション URL にファイル拡張子を含めるか、IIS で "*" ハンドラー マッピングを使用するようにアプリケーションを構成する必要があります。
- URL 書き換えモジュールは、ドメイン名、HTTP ヘッダー、サーバー変数に基づいて書き換えの判断を行うことができます。 既定では、ASP.NET ルーティングは URL パスおよび HTTP メソッド ヘッダーに対してのみ機能します。
- URL 書き換えモジュールは、書き換えの他にも、HTTP リダイレクト、カスタム ステータス コードの発行、要求の中止を実行できます。 ASP.NET ルーティングは、これらの操作を実行できません。
- 現在のバージョンの URL 書き換えモジュールは拡張できません。 ASP.NET ルーティングは、拡張とカスタマイズを自由に行うことができます。
どちらを使用するか
Web アプリケーション用にクリーンな URL を使用できるようにするテクノロジを選択する場合に、以上の情報がどのような意味を持つかについて検討します。 このセクションでは、この選択方法を説明します。
ASP.NET 以外を使用して構築された Web アプリケーションの場合、選択は明らかです。IIS URL 書き換えモジュールを使用してください。 その他の場合についての経験則は以下のとおりです。
- ASP.NET MVC (英語) または ASP.NET 動的データ (英語) テクノロジを使用する新しい ASP.NET Web アプリケーションを開発する場合は、ASP.NET ルーティングを使用してください。 Web ページ内のリンク用のクリーンな URL の生成をはじめとする、クリーンな URL のネイティブ サポートという利点をアプリケーションで活用できます。 ASP.NET ルーティングは、標準の Web フォーム アプリケーションをまだサポートしていないことに注意してください。将来的には、サポートする計画があります。
- 既にレガシ ASP.NET Web アプリケーションがあり、このアプリケーションを変更しない場合は、URL 書き換えモジュールを使用してください。 URL 書き換えモジュールを使用すると、検索エンジンに対応した URL を、現在アプリケーションが使用している形式に変更できます。 さらに、検索エンジンのクローラーをクリーンな URL にリダイレクトするためのリダイレクト規則も作成できます。
実際には、どちらか 1 つのみを選択する必要はありません。 これらのテクノロジは同時に使用でき、互いに補完できます。 以下のセクションでは、ASP.NET ルーティングと IIS URL 書き換えを一緒に使用する場合のいくつかのシナリオの概要を示します。
アプリケーションに正規 URL を強制する。たとえば、http://mysite.com/Home/About の代わりに http://www.mysite.com/home/about の使用を強制するとします。 Web クライアントが期待される形式に一致しない URL を要求したときに、そのクライアントを正規 URL にリダイレクトします。 このシナリオでは、URL 書き換えモジュールを使用して正規 URL の強制とリダイレクトを実行し、ASP.NET ルーティングを使用して、要求された URL パスを処理するハンドラーを選択できます。
このシナリオで使用できる URL 書き換えルールの例を次に示します。
<rewrite>
<rules>
<rule name="Enforce canonical hostname" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mysite\.com$" />
</conditions>
<action type="Redirect" url="http://www.mysite.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
静的コンテンツを別のサイトまたはサーバーから提供する。たとえば、動的な Web コンテンツがサイトまたはサーバーに配置され、静的コンテンツのすべてが別のサイトまたはサーバーにあるという形で、Web アプリケーションが複数のサーバーに配置されているとします。 URL 書き換えモジュールを IIS Application Request Routing モジュールと一緒に使用すると、動的 Web ページに対するすべての要求を現在のサーバーで提供しながら、静的ファイルに対するすべての要求を別のサーバーに転送できます。 このようすると、ASP.NET ルーティングは動的 Web コンテンツに対してのみ使用され、静的コンテンツの URL は ASP.NET ルーティングによって評価されません。
このシナリオで使用できる URL 書き換えルールの例を次に示します。
<rewrite>
<rules>
<rule name="Forward to static file server">
<match url="^.+\.(?:jpg|bmp|gif)$" />
<action type="Rewrite" url="http://static_file_server/{R:0}" />
</rule>
</rules>
</rewrite>
静的コンテンツを管理する。 静的ファイルまたはフォルダーを新しい場所に移動するときに、以前と同じ URL でも機能するように、旧 URL のサポートも必要になることがあります。 実際には、ファイルまたはフォルダーが移動されたことが Web サイトの訪問者にわからないようにします。 この場合は、動的 ASP.NET Web ページをルーティング モジュールで処理し、URL 書き換えモジュールを使用して静的ファイル用のパスを書き換えることができます。
このシナリオで使用できる URL 書き換えルールの例を次に示します。
<rewrite>
<rules>
<rule name="Rewrite to new folder">
<match url="^Images/(.+)$" />
<action type="Rewrite" url="NewImages/{R:1}" />
</rule>
</rules>
</rewrite>
要求をブロックする。 URL 書き換えモジュールを使用すると、さまざまな条件に基づいて特定の要求をブロックできます。 たとえば、Web サイト上の特定の URL パスに対して、特定のサイト クローラーがアクセスしないようにすることができます。 このようにすると、禁止された要求は ASP.NET ルーターに送られないので、Web サーバーの負荷を低減できます。
望ましくないサイト クローラーのブロックに使用できる URL 書き換えルールの例を次に示します。 特定の URL パスに対する要求のブロックは、ユーザー エージェント HTTP ヘッダーまたはクライアントの IP アドレスに基づいて行われることに注意してください。
<rewrite>
<rules>
<rule name="Block SomeRobot" stopProcessing="true">
<match url="^folder1/folder2" />
<conditions logicalGrouping="MatchAny">
<add input="{USER_AGENT}" pattern="SomeRobot" />
<add input="{REMOTE_ADDR}" pattern="201\.45\.33\.[0-5]" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
今後の方針
IIS URL 書き換えモジュールと ASP.NET ルーティングには機能が重複している部分がありますが、それぞれのテクノロジで対処できる固有のシナリオがあります。 そのため、これら 2 つのテクノロジは、潜在的に緊密に調和しながら、IIS の独立したコンポーネントとして存在し発展し続けます。 たとえば、ASP.NET ルーティングを使用することで、URL 書き換えモジュールで提供される機能豊富なツールのいくつかを強化できます。 これに対して、URL 書き換えモジュールでは URL 書き換えロジックのカスタマイズのための拡張機能が提供され、ASP.NET との統合が強化されます。
まとめ
Web アプリケーションに URL 操作のシナリオを実装する場合、IIS URL 書き換えモジュールと ASP.NET ルーティングのどちらも使用できます。 ASP.NET ルーティングは ASP.NET に最適化されたソリューションであり、クリーンな URL 構造を得るために ASP.NET アプリケーションを基盤から設計する開発者に推奨される選択と考えられます。 IIS の URL 書き換えは、多くのシナリオに対処できる一般的な URL 操作メカニズムであり、 特に、Web 開発者および Web サーバー/サイト管理者は、アプリケーション コードを変更することなく既存の Web アプリケーションでクリーンな URL を使用できます。