2012-02-29 22 views
7

(*などの)許可されていない文字があるページを呼び出すと、「危険なRequest.Path値が検出されました」という黄色のページが表示されます。 これは400エラーページのようです。 私の目標は、このページをカスタマイズし、きれいなエラーページを表示するか、ホームページにリダイレクトすることです(私は両方のソリューションを試しました)。私はIIS7を使用してい「潜在的に危険なRequest.Path値が検出されました」エラーページ

<system.webServer> 
<httpErrors errorMode="Custom"> 
    <remove statusCode="400" subStatusCode="-1" /> 
    <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="400" path="/page-non-trouvee.aspx?status=400" responseMode="ExecuteURL" /> 
    <error statusCode="404" path="/" responseMode="ExecuteURL" /> 
</httpErrors> 

: は、ここで私は私のweb.configファイルに書いたものです。 私の400ページはまだ黄色のエラーページとして表示されています。

スタックExchangeデータエクスプローラがhttp://data.stackexchange.com/users&nbspスタックオーバーフロー自体に問題がないているがための回避策が存在する必要があります:https://stackoverflow.com/users&nbsp

任意のアイデア?

<customErrors mode="On" redirectMode="ResponseRedirect" defaultRedirect="/404" /> 

しかし、これは元のパスとセグメントと迷惑なクエリ文字列につながる:gbianchiが述べたように

+0

あなたが見ている現在のエラーページがポイントに、アプリケーションの<のcustomErrors>構成タグの「defaultRedirectで」属性を変更することで、カスタムエラーページで置き換えることができますカスタムエラーページのURLに変換します。これはあなたを助けない? – gbianchi

+0

IIS7 +を使用している場合、ここにはもっと簡単な解決策があります: - http://stackoverflow.com/questions/30071341/asp-net-mvc-customerror-page-doesnt-get-displayed-for-some-of-the- 400エラー/ 30072933#30072933 –

答えて

8

は、あなたがcustomErrorsはこのようにリダイレクト行うことができます。

ASP.NETアプリケーションの場合は、Application.ErrorイベントがGlobal.asax.csファイルでオーバーロードされる可能性があります。ここではMVCでそれを行うためのハックっぽい方法です:

protected void Application_Error() { 
    var exception = Server.GetLastError(); 
    var httpException = exception as HttpException; 
    if (httpException == null) { 
     return; 
    } 

    var statusCode = httpException.GetHttpCode(); 
    // HACK to get around the Request.Path errors from invalid characters 
    if ((statusCode == 404) || ((statusCode == 400) && httpException.Message.Contains("Request.Path"))) { 
     Response.Clear(); 
     Server.ClearError(); 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Error"; 
     routeData.Values["exception"] = exception; 
     Response.StatusCode = statusCode; 
     routeData.Values["action"] = "NotFound"; 

     // Avoid IIS7 getting in the middle 
     Response.TrySkipIisCustomErrors = true; 
     IController errorsController = new ErrorController(); 
     HttpContextWrapper wrapper = new HttpContextWrapper(Context); 
     var rc = new RequestContext(wrapper, routeData); 
     errorsController.Execute(rc); 
    } 
}