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

Lau*_*ron 7 .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>
Run Code Online (Sandbox Code Playgroud)

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

必须有一个解决方法,因为尽管Stack Exchange Data Explorer有http://data.stackexchange.com/users这个问题,但Stack Overflow本身并没有:https://stackoverflow.com/users 

有任何想法吗?

Jef*_*ser 8

正如gbianchi所提到的,你可以像这样做一个customErrors重定向:

<customErrors mode="On" redirectMode="ResponseRedirect" defaultRedirect="/404" />
Run Code Online (Sandbox Code Playgroud)

但是,这会导致与原始路径和段相关的恼人的查询字符串.

如果它是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);
    }
}
Run Code Online (Sandbox Code Playgroud)