1

我正在使用ASP.NET MVC3和运行网站Windows Server 2003。我试图弄清楚如何处理所有 HTTP 错误。我已经实现了代码,但是当返回 404 错误时,有时会在浏览器中显示 403 错误。

这是我实现的代码:

在我的global.asax.cs

protected void Application_Error(object sender, EventArgs e)
{
     MvcApplication app = (MvcApplication)sender;
     HttpContext context = app.Context;
     Exception exception = app.Server.GetLastError();
     context.Response.Clear();
     context.ClearError();
     HttpException httpException = exception as HttpException;

     RouteData routeData = new RouteData();
     routeData.Values["controller"] = "Error";
     routeData.Values["action"] = "Index";
     routeData.Values["httpException"] = httpException;

     Server.ClearError();

     IController errorController = new ErrorController();
     errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

ErrorController.cs文件:

public class ErrorController : Controller
{
     public ActionResult Index()
     {
          ErrorModel model = new ErrorModel();

          HttpException httpException = RouteData.Values["httpException"] as HttpException;
          int httpCode = (httpException == null) ? 500 : httpException.GetHttpCode();

          switch (httpCode)
          {
               case 403:
                    //Response.StatusCode = 403;
                    model.Heading = "Forbidden";
                    model.Message = "You aren't authorised to access this page.";
                    break;
               case 404:
                    //Response.StatusCode = 404;
                    model.Heading = "Page not found";
                    model.Message = "We couldn't find the page you requested.";
                    break;
               case 500:
               default:
                    Response.StatusCode = 500;
                    model.Heading = "Error";
                    model.Message = "Sorry, something went wrong.  It's been logged.";
                    break;
          }

          Response.TrySkipIisCustomErrors = true;

          return View(model);
     }
}

我的 web.config 中没有设置任何内容。

我希望它在用户尝试访问我的目录(例如app_code和类似目录)时显示正确的错误。这可能吗?

当我输入http://localhost:43596/app_code然后我看到它似乎是一个 404 错误,但它显示 IE 的默认 403 错误页面。如何让我的代码显示正确的 HTTP 错误消息?

我想要这种方式的原因是因为如果用户试图以任何方式破坏网站,我需要记录所有尝试。我希望能够看到谁在做错误的访问。

4

2 回答 2

1

当我输入http://localhost:43596/app_code然后我看到它似乎是一个 404 错误,但它显示 IE 的默认 403 错误页面。

403有什么问题?

在万维网上使用的 HTTP 中,403 Forbidden 是当用户请求服务器不允许他们访问的网页或媒体时,Web 服务器返回的 HTTP 状态代码。换句话说,服务器可以访问,但服务器拒绝允许访问该页面。当目录列表被拒绝时,Microsoft IIS 以相同的方式响应。

维基百科

当用户尝试访问该App_Data文件夹时,如果您返回 404,则意味着该文件夹在服务器中不存在,但事实是该文件夹可能存在也可能不存在,因为它是 ASP.NET 不存在的特殊文件夹不允许任何人访问它并且它是被禁止的,所以我认为在这种情况下返回 403 是完全有效的。

缺少目录索引时的 404 与 403

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

于 2012-06-02T12:22:21.737 回答
0

尝试查看 web.config 部分“customErrors”设置“mode=Off”

<configuration>
 <system.web>
  <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly">
  <error statusCode="500" redirect="InternalError.htm"/>
</customErrors>

于 2012-06-02T13:19:38.937 回答