URLのリダイレクト
開発環境: Visual Studio 2005
1.目次
1.目次
2.目的
3.参考書
4.URL リダイレクトの実現方法
5.HttpModule を利用する方法
5.
1 Web.Config へのHttpModule を追加する。
5.2 HttpModuleを実装する。
5.3 HttpModule
を利用する場合の注意
6.HttpHandler を利用する方法
2.目的
ASP.NET 2.0で、URLをリダイレクトする方法について。
"http://uchukamen.com/Default.aspx?category=csharp & sub = UrlRedirect" なんて、見にくいですよね。このようなURLではなく、"http://uchukamen.com/csharp/UrlRedirect/" というように指定できるとうれしい場合があります。このようなURLを書き換えることを URL Redirectと言いますが、この方法について説明します。
3.参考書
-
MSDN: ASP.NET での URL 書き換え
- ASP.NET
2.0: URL Mapping with RegEx Support
- ASP.NET 2.0: Rewriting URL Paths just got a whole lot easier
4.URL リダイレクトの実現方法
URLリダイレクトを行う方法には、2つあります。1つが、HttpModuleで書き換える方法と、もう1つが、HttpHandlerで書き換える方法です。この2つの方法のメカニズムを理解し、どちらで実装するか検討する必要があります。この説明に関しては、参考書(1)が詳しいです。
一応、概念図を下に示します。HTTPリクエストがIISに入り、.NETのモジュールが必要な場合には、まずASP.NETエンジンに渡され、適切なHTTPモジュールの処理が行われます。次にHTTPハンドラで最終的な処理が行われ、その結果がレスポンスとして返されるように動作します。
URLのリダイレクトを行う場所としては、(1)HttpModuleを追加する。(2)Httpハンドラを実装する。の2つがあります。
5.HttpModule を利用する方法
HttpModuleを利用するには、次のようにします。
(1) Web.Config に URLを書き換える HttpModule を定義する。
(2) IHttpModule を実装するアセンブリ (HttpModule) を配置する。
5.1 Web.Config へのHttpModule を追加する。
Web.Config で、HttpModule を定義します。system.web ブロックに、次のように IHttpModuleを実装するアセンブリ(ここでは、Uchukamen.Web.UrlRedirectModule)を指定します。これにより、このWeb.Config 以下のページに対して、IHttpModule を実装するアセンブリが呼び出されます。
| Web.Config |
| <?xml
version="1.0"?> <configuration> <appSettings/> <connectionStrings/> <system.web> <httpModules> <add name="UrlRedirectModule" type="Uchukamen.Web.UrlRedirectModule"/> </httpModules> <compilation debug="true"/> <authentication mode="Windows"/> </system.web> </configuration> |
5.2 HttpModuleを実装する。
ソリューションに、クラスライブラリプロジェクトを追加し、IHttpModuleインターフェイスを実装するモジュールを作成します。IHttpModuleインターフェースでは、Init, Dispose を実装する必要があります。次のコードが Url をリダイレクトする最低限のコードです。ここでは、Default.aspx を RedirectedPage.aspx へ無条件にリダイレクトしています。
| UrlRedirectModle.cs |
| using
System; using System.Web; namespace Uchukamen.Web { public class UrlRedirectModule : IHttpModule { public void Init(HttpApplication application) { application.BeginRequest += new EventHandler ( this.OnBeginRequest ); } private void OnBeginRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; if(application.Request.Url.AbsoluteUri.EndsWith("default.aspx")) application.Response.Redirect("~/RedirectedPage.aspx"); } public void Dispose() { } } } |
5.3 HttpModule を利用する場合の注意
HttpModuleでは、次の順番にイベントが発生します。URLをリダイレクトする際には、どのイベントでリダイレクト処理をするかによって、認証、承認プロセスの対象URLが書き換えられてしまいます。
| イベント発生順序 | イベント | 注意制限事項 |
| 1 | BeginRequest | リダイレクトされたURLに対してフォーム認証が行われる。 |
| 2 | AuthenticateRequest | リダイレクトされたURLに対してAuthenticationが行われる。 |
| 3 | AuthorizedRequest | リダイレクトされたURLに対してAuthorizationが行われる。 |
たとえば、BeginRequest イベントで書き換えを行った場合、認証が必要なAuthorize.aspx というURLを 認証を必要としない Redirected.aspx に書き換えてしまうと、認証が行われないことになってしまいます。
6.HttpHandler を利用する方法
HttpHandler を使用する場合には、次のように Web.Config ファイルのconfiguration/system.web セクションに次のようにhttpHandlers タグを追加します。そして、IHttpHandlerFactory インターフェイスを実装するアセンブリを作成し、配置します。
| Web.Config |
| <httpHandlers> <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHndler, URLRewriter" /> </httpHandlers> |
この方法は未確認です。HttpModule を使う場合とHttpHandlerを使う場合のメリット、デメリットも参考書(1)からは良くわかりません。
ただ、4章の図の処理プロセスを考えると、URLのリダイレクトのような個別の処理はHttpModuleに実装するのが適切のような気がします・・・