ASP.NETを使ってWebサイトを作成しているときに、存在しないURLが指定されたとき、つまり、Status Code 404が発生するときに特定の専用ページを開きたいときがあります。
例えば、存在しないURLが指定されたときは、StatusCode404.aspxをいうページにそのURLを記載して表示したいとしましょう。もちろん、記載できるという事はURLを取得できているということなので、その他の処理も自由に記述できるでしょう。
web.configで指定する方法
web.config
web.configのcustomErrors要素で404エラーのredirect先を指定します。
<configuration>
:(省略)
<system.web>
:(省略)
<customerrors defaultredirect="GenericErrorPage.htm" mode="On">
</customerrors>
:(省略)
</system.web>
:(省略)
</configuration>
この指定により、404が発生したときはすべてStatusCode404.aspxにリダイレクトされます。なお、customErrors要素のmode項目はRemoteOnlyになっています。このままだとIDEで実行中のようにローカル実行しているときはリダイレクトされないので、Onにして確認してください。
StatusCode404.aspx
web.configの定義によりリダイレクトされたときは「aspxerrorpath」というQueryStringが指定されてリダイレクトされます。
Partial Class StatusCode404
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
If Not Me.Request.QueryString("aspxerrorpath") Is Nothing Then
Dim url As String = System.Web.HttpUtility.UrlDecode( _
Me.Request.QueryString("aspxerrorpath"))
Me.Url_Label.Text = System.Web.HttpUtility.HtmlEncode(url)
End If
End If
End Sub
End Class
Global.asaxで指定する方法
Global.asax
Global.asaxからも404エラー発生時にStatusCode404.aspxを呼び出す事ができます。 web.configのcustomErrors要素で404えらーのりダイレクトが定義されていないかを確認してから、Global.asaxにコードを記述します。
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' ハンドルされていないエラーが発生したときに実行するコードです
Dim ex As Exception = Server.GetLastError
If Not ((TypeOf ex Is HttpException) AndAlso _
(CType(ex, HttpException).GetHttpCode() = 404)) Then
'404以外は何もしない
Else
'404エラーなので記録しない
Me.Response.Redirect("StatusCode404.aspx?aspxerrorpath=" & _
System.Web.HttpUtility.UrlEncode(Me.Request.RawUrl), _
True)
End If
End Sub
この指定により、404が発生したときはすべてStatusCode404.aspxにリダイレクトされます。
StatusCode404.aspx
Global.asaxでリダイレクト時に「aspxerrorpath」というQueryStringが指定していますので、web.configで定義したときと同じコードで動作します。