Обработка ошибки 404 в ASP.NET

Материал предоставлен сайтом Территория Дмитрия Новоженова (http://www.novojonov.ru)

Проблема ошибки 404 в ASP.NET

Классической рекомендацией по обработке ошибкок в ASP.NET является настройка элемента <customErrors> в файле Web.config. Но при этом возникает существенная проблема, обрабатывая ошибку внутри, среда выполнения выдает "на улицу" код HTTP 200. А это не соответствует действительности.

Это не проблема, когда ошибку 404 получает пользователь, мы услужливо подсовываем ему страничку с вариантами перехода по "правильным" URL, так что все довольны. Но если агентом выступает поисковик, случается беда. Странички с запрошенным URL нет на сервере, допустим мы ее просто грохнули, но поисковик, в процессе индексации сайта, запросив отсутствующую страничку, пролучает HTTP 200 OK и считает что страничка есть, выдавая пользователям "битые" линки.

Таким образом, если Вы занимаетесь оптимизацией своего сайта для поисковых систем, или разрабатываете сайт, с учетом оптимизации под поисковики, обратите внимание на эту, может и незначительную, но засаду, оставленную нам всем Биллом =)

Решение проблемы ошибки 404 в ASP.NET

Решить описанную проблему "штатными" средствами, т.е. простым переконфигурированием среды исполнения, мне не удалось. Не буду утверждать категорично, возможно, просто плохо старался, но не удалось. В качестве пути решения я выбрал программирование собственного фильтра, перехватывающего ошибки среды исполнения ASP.NET и реагирующего исключительно на 404-ю ошибку.

Цель при поиске решения ставилась простая, настроить обработку ошибки 404 таким образом, чтобы программирования было по-минимуму, задача была решена и стандартный механизм продолжил работать. Т.е. делать по-минимуму, а получить по-максимуму =)

Страница для вывода пользователю

Для обеспечения дружественного пользователю интерфейса (и сохранения лица при ошибке =) верстается статическая страничка, например 404.html, и помещается в выбранную локацию. В моем случае - в корневой каталог сайта. Эта страничка будет выдаваться пользователю в том случае, если он запросит несуществующий URL.

Статической данная страничка верстается по той причине, что статику можно будет указать в качестве странички 404 в IIS, добившись, таким образом, симпатичной реакции на запросы не только динамики, но и статики.

Требования к содержанию страницы не предъявляются, однако все "столпы" настоятельно рекомендуют разместить на ней список URL типа "куда податься", чтобы облегчить пользователю поиск нужного URL. В моем случае на ней размещены:

  1. Ссылка на главную страницу;
  2. Ссылка на карту сайта;
  3. Ссылка на отправку письма Администратору;

Код моей страницы можно посмотреть, набрав в броузере URL http://www.novojonov.ru/404.html.

Конфигурация customErrors в файле Web.config

В файле Web.config мы настраиваем обработку ошибок традиционным образом, например так:

 <customErrors mode="On" defaultRedirect="~/error.html" /> 

Обратите внимание на то, что обработка ошибки 404 исключена из настройки системы. Это сделано потому, что мы собираемся обрабатывать ее самостоятельно, помните?

Анализ и обработка ошибок в файле Global.asax

Обработка ошибок будет осуществляться в файле Global.asax. Для этого создадим обработчик события Application_Error, например такой:

protected void Application_Error(object sender, EventArgs e)
{
    HttpContext oHttpContext;
    Exception oException;

    oHttpContext = HttpContext.Current;

    oException = oHttpContext.Server.GetLastError();

    if (oException is HttpException)
    {
        switch ((oException as HttpException).GetHttpCode())
        {
            case 404:

                oHttpContext.Response.StatusCode = 404;
                oHttpContext.Response.StatusDescription = "Not Found";
                oHttpContext.Response.Charset = "windows-1251";
                oHttpContext.Server.Execute("~/404.html");
                
                oHttpContext.Server.ClearError();

                break;
        }
    }
}

Механизм обработки ошибки 404 в ASP.NET действует по следующему алгоритму:

  1. Обработчик получает последнюю ошибку от сервера;
  2. Проверяется тип ошибки, если это HttpException, ошибка обрабатывается;
  3. Проверяется код ошибки, если это 404, ошибка обрабатывается;

Обработка ошибки включает в себя следующие шаги:

  1. Установить возвращаемый код ошибки 404;
  2. Сгенерировать тело документа из статического шаблона;
  3. Очистить код ошибки на сервере;

За счет подобного фильтра я обрабатываю только те ошибки, которые мне интересны, т.е. пересматриваю стандартную реакцию системы. Остальные-же ошибки обрабатываются стандартным образом средой исполнения ASP.NET.

Заключение

Таким образом, мы получили систему, которую хотели, пусть незначительно, но усовершенствовав механизм обработки ошибок в ASP.NET. Пользователи, как и раньше, получают дружественную страничку, поисковики, при запросе несуществующего URL, получают чистую правду АКА 404, сайт реагирует в соотвествии с общепринятыми стандартами.

Материал предоставлен сайтом Территория Дмитрия Новоженова (http://www.novojonov.ru)