URLのリダイレクト
開発環境: Visual Studio 2005
1.目次
2.目的
3.参考書
4.URL リダイレクトの実現方法
5.HttpModule を利用する方法
5.
1 Web.Config へのHttpModule を追加する。
5.2 HttpModuleを実装する。
5.3 HttpModule
を利用する場合の注意
6.HttpHandler を利用する方法
ASP.NET 2.0で、URLをリダイレクトする方法について。
"http://uchukamen.com/Default.aspx?category=csharp & sub = UrlRedirect"
なんて、見にくいですよね。このようなURLではなく、"http://uchukamen.com/csharp/UrlRedirect/"
というように指定できるとうれしい場合があります。このようなURLを書き換えることを URL
Redirectと言いますが、この方法について説明します。
-
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
URLリダイレクトを行う方法には、2つあります。1つが、HttpModuleで書き換える方法と、もう1つが、HttpHandlerで書き換える方法です。この2つの方法のメカニズムを理解し、どちらで実装するか検討する必要があります。この説明に関しては、参考書(1)が詳しいです。
一応、概念図を下に示します。HTTPリクエストがIISに入り、.NETのモジュールが必要な場合には、まずASP.NETエンジンに渡され、適切なHTTPモジュールの処理が行われます。次にHTTPハンドラで最終的な処理が行われ、その結果がレスポンスとして返されるように動作します。
URLのリダイレクトを行う場所としては、(1)HttpModuleを追加する。(2)Httpハンドラを実装する。の2つがあります。
HttpModuleを利用するには、次のようにします。
(1) Web.Config に URLを書き換える HttpModule を定義する。
(2) IHttpModule を実装するアセンブリ (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> |
ソリューションに、クラスライブラリプロジェクトを追加し、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() { } } } |
HttpModuleでは、次の順番にイベントが発生します。URLをリダイレクトする際には、どのイベントでリダイレクト処理をするかによって、認証、承認プロセスの対象URLが書き換えられてしまいます。
イベント発生順序 |
イベント |
注意制限事項 |
1 |
BeginRequest |
リダイレクトされたURLに対してフォーム認証が行われる。 |
2 |
AuthenticateRequest |
リダイレクトされたURLに対してAuthenticationが行われる。 |
3 |
AuthorizedRequest |
リダイレクトされたURLに対してAuthorizationが行われる。 |
たとえば、BeginRequest イベントで書き換えを行った場合、認証が必要なAuthorize.aspx
というURLを 認証を必要としない Redirected.aspx に書き換えてしまうと、認証が行われないことになってしまいます。
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に実装するのが適切のような気がします・・・