Делаем нормальную ошибку для отсутствующих страниц, которая не испугает пользователя, а роботу покажет корректный код без всяких редиректов.
1. Контроллер с методами для каждой ошибки. Не забудьте создать представление для каждого метода.
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.Web.Mvc; using System.Web.SessionState; using System.Web.UI; //Тут ваш namespace не забудьте [SessionState(SessionStateBehavior.Disabled)] [OutputCache(Location = OutputCacheLocation.None, NoStore = true)] public class ErrorController : Controller { // 500 public ActionResult InternalServerError() { SetResponse(HttpStatusCode.InternalServerError); return View(); } // 404 public ActionResult NotFound() { SetResponse(HttpStatusCode.NotFound); return View(); } // 403 public ActionResult Forbidden() { SetResponse(HttpStatusCode.Forbidden); return View(); } private void SetResponse(HttpStatusCode httpStatusCode) { Response.StatusCode = (int)httpStatusCode; Response.StatusDescription = HttpWorkerRequest.GetStatusDescription((int)httpStatusCode); } protected override void OnActionExecuted(ActionExecutedContext context) { // log }
2. Настройки Web.config для перенаправления в этот контроллер
<system.web> <customErrors mode="Off"/> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="403" /> <remove statusCode="404" /> <remove statusCode="500" /> <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL" /> <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" /> <error statusCode="500" path="/Error/InternalServerError" responseMode="ExecuteURL" /> </httpErrors> </system.webServer>