2012-02-29 15 views
7

Cuando llamo a una página con un carácter no autorizado (como *), aparece una página amarilla "Se detectó un valor Request.Path potencialmente peligroso". Parece que es una página de error de 400. Mi objetivo es personalizar esta página y mostrar una página de error limpio o redirigir a la página de inicio (probé ambas soluciones). Esto es lo que escribí en mi web.config:Personalizar "Se detectó un valor Request.Path potencialmente peligroso" página de error

<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> 

estoy usando IIS7. El punto es que mi página de 400 todavía se muestra como una página de error amarilla.

Tiene que haber una solución, porque aunque el Explorador de datos Stack Exchange tiene este problema con http://data.stackexchange.com/users&nbsp desbordamiento de pila en sí no lo hace: https://stackoverflow.com/users&nbsp

¿Alguna idea?

+0

La página de error actual que está viendo puede ser sustituida por una página de error personalizado mediante la modificación del atributo "defaultRedirect" de etiqueta de configuración de la aplicación para señalar a una URL de página de error personalizada. esto no te ayuda? – gbianchi

+0

Si está utilizando IIS7 +, aquí hay una solución más simple: - http://stackoverflow.com/questions/30071341/asp-net-mvc-customerror-page-doesnt-get-displayed-for-some-of-the- 400 errores/30072933 # 30072933 –

Respuesta

8

Como gbianchi mencionados, se podría hacer una redirección customErrors así:

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

Sin embargo, esto se traduciría en una cadena de consulta molesto con la ruta original y segmento.

Si se trata de una aplicación ASP.NET, puede sobrecargar el evento Application_Error en su archivo Global.asax.cs. Aquí está una manera hack-ish de hacerlo en 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); 
    } 
} 
Cuestiones relacionadas