自定义“检测到潜在危险的Request.Path值”错误页面

时间:2012-02-29 11:22:50

标签: .net web-config

当我调用具有非授权字符(例如*)的页面时,我得到一个黄色页面“检测到潜在危险的Request.Path值”。 看起来它是400错误页面。 我的目标是自定义此页面并显示一个干净的错误页面或重定向到主页(我尝试了两种解决方案)。 这是我在web.config中写的:

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

我正在使用IIS7。 关键是我的400页仍显示为黄色错误页面。

必须有一种解决方法,因为尽管Stack Exchange Data Explorer有http://data.stackexchange.com/users&nbsp Stack Overflow本身存在此问题但不会:https://stackoverflow.com/users&nbsp

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

正如gbianchi所提到的,你可以像这样进行customErrors重定向:

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

但是,这会导致原始路径和段出现令人讨厌的查询字符串。

如果是ASP.NET应用程序,则可能会重载Global.asax.cs文件中的Application_Error事件。这是在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);
    }
}