ASP.NET Webアプリケーションでは、web.configファイルで次のようにカスタムエラーページを定義しています。
<customErrors mode="On" defaultRedirect="~/default.html">
<error statusCode="404" redirect="~/PageNotFound.html" />
</customErrors>
404エラーの場合、私のサイトはdefault.html
ページ、ただし「aspxerrorpath」をクエリ文字列パラメーターとして次のようにカスタムエラーページに渡します。
http://www.example.com/default.html?aspxerrorpath=/somepathcausederror/badpage.aspx
私はそのふるまいを望まない。リダイレクトURLを単に読み取りたいです。
http://www.example.com/default.html
これを達成する方法はありますか?
私が最初に考えたのは、aspxerrorpath
を含むURLをキャッチしてそれを取り除くHttpHandlerを作成することです。 IIS7の書き換えモジュールでも同様のことができます。
パスを指定するときに独自のクエリ文字列変数を指定した場合、.NETは「aspxerrorpath」を追加しません。誰かわかったね?
例えば:
<customErrors mode="On" defaultRedirect="errorpage.aspx?error=1" >
これでうまくいきます。 URLScan for IISはデフォルトで「aspxerrorpath」が含まれているものはすべて拒否するため、これをアプリの束に追加する必要がありました。
Global.asaxで、404エラーをキャッチし、ファイルが見つからないページにリダイレクトします。私はaspxerrorpathを必要としませんでした。
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404)
{
Response.Redirect("~/filenotfound.aspx");
}
else
{
// your global error handling here!
}
}
独自のURLパラメーターをエラーページに送信することができます
<customErrors mode="On" defaultRedirect="~/default.html?404">
<error statusCode="404" redirect="~/PageNotFound.html?404" />
</customErrors>
代わりに、Global.asaxで Application_Error イベントを実装/使用し、そこで処理/リダイレクトを行うと思います。
そのハンドラで Server.ClearError を呼び出すと、customErrors configをまったく使用しないと思います。
私は次のようなjavascriptを使用します
if (location.search != "") { window.location.href = "/404.html"; }
最良の解決策(さらに回避策。) ASP.NET CustomErrorsサポートを引き続き使用するaspxerrorpath
問題を防ぐために実装したのは、エラー処理を実装するアクションにリダイレクトすることです。
これらは、ASP.NET MVC Webアプリコンテキストでの私のソリューションのいくつかのステップです。
最初にweb.configでカスタムエラーモジュールを有効にします
<customErrors mode="On" defaultRedirect="~/error/500">
<error statusCode="404" redirect="~/error/404"/>
</customErrors>
次に、ルーティングルールを定義します。
routes.MapRoute(
name: "Error",
url: "error/{errorType}/{aspxerrorpath}",
defaults: new { controller = "Home", action = "Error", errorType = 500, aspxerrorpath = UrlParameter.Optional },
);
最後に、次のアクション(および関連ビュー)を実装します。
public ActionResult Error(int errorType, string aspxerrorpath)
{
if (!string.IsNullOrEmpty(aspxerrorpath)) {
return RedirectToRoute("Error", errorType);
}
switch (errorType) {
case 404:
return View("~/Views/Shared/Errors/404.cshtml");
case 500:
default:
return View("~/Views/Shared/Errors/500.cshtml");
}
}
追加 redirectMode="ResponseRewrite"
このようなカスタムエラーでは、
<customErrors mode="On" defaultRedirect="~/NotFound">
<error statusCode="404" redirect="~/NotFound" redirectMode="ResponseRewrite"/>
</customErrors>
このソリューションは私のために機能します。
Aspxerrorpath = /を削除し、エラー処理中に応答リダイレクトを使用すると、リダイレクトループの例外が発生します。