Отправляет email-рассылки с помощью сервиса Sendsay

.NET: Записки программиста

  Все выпуски  

Как правильно создать страницу 404 или один слуга для двух хозяев


Сайт .NET: Записки программиста

Как правильно создать страницу 404 или один слуга для двух хозяев

"А что тут сложного?" удивитесь вы. А потом, подумав "вряд ли он ответит 'ничего' и этим закончит статью", спросите - "а в чем подвох?".

Подвох конечно есть. Но давайте сначала посмотрим, что вообще можно сделать. Самый просто вариант - ничего. Ваш сайт честно отошлет пользователю код возврата 404 и тот увидит в браузере что-то вроде:

страница 404

Внешний вид зависит от конкретного браузера и настроек провайдера пользователя. Например, вместо страницы по умолчанию, пользователю могут показывать какую-то рекламу, а это еще обиднее :)

Разработчики сайтов конечно понимают, что так поступать нельзя. Если это не ваш постоянный посетитель - после такого ответа вы его потеряли. Поэтому на сайте создается специальная страница, которая выводится, когда никто не знает что делать с этом странным адресом. Она имеет такой же внешний вид как и остальные страницы сайта и должна сказать посетителю "Все замечательно и под контролем! Да, вот этой информации у нас нет, но вы можете поискать здесь, или перейти вот сюда".

Вот так это, например, выглядит на сайте "сами знаете кого":

страница 404

А теперь, посмотрим чуть дальше. Да, с пользователем мы разобрались. А вот что будет с поисковыми серверами?

Небольшой следственный эксперимент. Создаем пустой ASP.NET проект и добавляем к нему стандартную обработку страниц, которых нет. Это делается очень просто:

  1. Создается новая страница, допустим PageNotFound.aspx, на которой вы отображаете все что хотите сказать пользователю.

  2. Вносим изменение в web.config:
    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="404" redirect="PageNotFound.aspx" />
    </customErrors>

Пробуем. Открываем наш сайт, запршиваем какую-нибудь "bla-bla-bla.aspx" - вуаля, мы видим нашу, только что созданную страницу. Все работает?

А теперь заглянем чуть глубже. С красивого уровня графики нырнем сразу на два уровня ниже -на уровень HTTP протокола. Открываем ваш любимый "сниффер" (у меня это - HttpWatcher) и еще раз запрашиваем "bla-bla-bla.aspx". Что мы видим:

HttpWatcher redirect

То есть, кода 404 у нас вообще нет, вместо него есть редирект 302 ("ресурс был временно перемещен") на нашу PageNotFound.aspx.

А теперь представьте, что в кеше поисковика есть какое-то количество ваших несуществующих urls. Причины могут быть разные:

  • Самая распространенная - для SEO оптимизации вы изменили структуру url. Конечно, вы позаботились о перенаправлении старых адресов, но что-то просто могли упустить или немного запутались в большом количестве правил.

  • Еще вариант - изменилась физическая структура сайта и часть страниц действительно исчезла. У меня так случилось при смене движка этого блога. О перенаправлении статей я позаботился, но часть страниц, которые создавал старый движок, пропала, а подходящего аналога в новой версии не было. Тупо перебрасывать эти запросы на главную страницу я не хотел, чтобы не смущать поисковик.

  • У вас большой сайт с сотнями тысяч страниц и сложной структурой. Этот сайт периодически меняется, так что поисковики постоянно накапливают какие-то, уже несуществующие адреса. Их может быть совсем немного, но при умножении на размер сайта и продолжительность его жизни - величина получится вполне приличная.
В результате, с точки зрения поисковика все эти страницы продолжают существовать и  ведут на одну и ту же страницу вашего сайта. Если вы пользуетесь Google \ Yandex Web Master, то увидите их в списках с ошибками. Ничего серьезного скорее всего не произойдет, но:
  • Они могут оставаться в кеше поисковика достаточно долго, так как 404 кода ("страница не существует") ему никто не отсылал.

  • Существует мнение (и мне оно кажется вполне логичным), что поисковики больше любят (читай, чаще индексируют, больше доверяют и т.д.) сайты, которые не создают им проблем с индексацией (т.е. раздел "Диагностика" в инструментах веб-мастера не содержит описание ошибок.
В результате я решил, что страница "404" должна формироваться для пользователя, но вовращаться с кодом "404". Для этого потребовалось внести несколько простых изменений:
  1. Убираем из web.config перенаправление на PageNotFound.aspx, чтобы отключить 302 редирект:
    <customErrors mode="On" defaultRedirect="GenericErrorPage.htm" />
  2. Передаем управление странице PageNotFound.aspx сами. Для этого в файле Global.asax добавляем следующий код в обработчик ошибок уровня приложения:
    void Application_Error(object sender, EventArgs e)
    {
        HttpException ex = Server.GetLastError() as HttpException;
        if (ex != null && ex.GetHttpCode() == (Int32)HttpStatusCode.NotFound)
        {
            Server.Execute("PageNotFound.aspx", false); Server.ClearError();
        }
    }
    То есть, если ошибка, это - "страница не найдена", нужно на самом деле выполнить PageNotFound.aspx и очистить стек ошибок (так как мы обработали эту ситуацию сами).

  3. На самой странице PageNotFound.aspx добавляем следующий код, возвращающий статус 404 браузеру:
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Response.StatusCode = (Int32)HttpStatusCode.NotFound;
    }

Все, теперь можно смотреть, что получилось:

HttpWatcher 404

Вот теперь совсем другое дело, нам вернулась наша страница, но уже с 404 кодом возврата. Теперь и пользователь и поисковик получат то, что мы хотим: один - "этого мы не нашли, но вы можете попробовать поискать что-то другое", второй - "такой страницы не существует".

И напоследок еще один совет. На вашей "404" странице кроме сообщения "Эта страница не найдена" вы можете разместить специальный "Google виджет для улучшения страницы 404". Это java script, который будет отображать примерно следующее:

Google виджет 404

Если вы можете поделиться своим опытом борьбы со списками ошибок, которые выводятся в инструментах веб-мастера - пишите, буду рад это с вами обсудить. И да будут к вам благосконны поисковые сервера! :)

блог сайта .NET: Записки программиста
Подпишись на блог сайта .NET: Записки программиста

В избранное