web-dev-qa-db-ja.com

ASP.NETカスタムエラーページにクエリ文字列として「aspxerrorpath」が渡されるのを防ぐ方法

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

これを達成する方法はありますか?

37
DSharper

私が最初に考えたのは、aspxerrorpathを含むURLをキャッチしてそれを取り除くHttpHandlerを作成することです。 IIS7の書き換えモジュールでも同様のことができます。

3
Mikael Svenson

パスを指定するときに独自のクエリ文字列変数を指定した場合、.NETは「aspxerrorpath」を追加しません。誰かわかったね?

例えば:

<customErrors mode="On" defaultRedirect="errorpage.aspx?error=1" >

これでうまくいきます。 URLScan for IISはデフォルトで「aspxerrorpath」が含まれているものはすべて拒否するため、これをアプリの束に追加する必要がありました。

69
Matt J.

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!
    }
}
11
Gareth Williams

独自のURLパラメーターをエラーページに送信することができます

<customErrors mode="On" defaultRedirect="~/default.html?404"> 
               <error statusCode="404" redirect="~/PageNotFound.html?404" /> 
</customErrors>
6
Shak18

代わりに、Global.asaxで Application_Error イベントを実装/使用し、そこで処理/リダイレクトを行うと思います。

そのハンドラで Server.ClearError を呼び出すと、customErrors configをまったく使用しないと思います。

私は次のようなjavascriptを使用します

if (location.search != "") { window.location.href = "/404.html"; } 
1
Diogo Cid

最良の解決策(さらに回避策。) 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");
    }
}
0
Ciro Corvino

追加 redirectMode="ResponseRewrite"このようなカスタムエラーでは、

<customErrors mode="On" defaultRedirect="~/NotFound">
     <error statusCode="404" redirect="~/NotFound" redirectMode="ResponseRewrite"/>
</customErrors>

このソリューションは私のために機能します。

0
Raji

Aspxerrorpath = /を削除し、エラー処理中に応答リダイレクトを使用すると、リダイレクトループの例外が発生します。

0
Pawel