Ошибка 404 - генерируем правильный статус для браузера и выводим страницу с ошибкой


12.10.2013 || Раздел: || Настройка KooBoo || IIS


Версия Kooboo на момент написания статьи: 4.2.1

Другое ПО: IIS 8 (7 или 7.5)

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

Описание проблемы: встроенные механизмы Kooboo позволяют настроить редирект при возникновении ошибки, но не выдают браузеру правильный код (всегда выдается код статуса 200, вместо, например, 404). Помимо этого роутеры Kooboo игнорируют некоторые типы файлов, вроде html, jpg и т.п. - для них необходимо отдельно настраивать редиректы на страницу с ошибкой.

Решение задачи кратко:

1) для файлов, игнорируемых kooboo, настроим редирект на kooboo-страницу с ошибкой через IIS (IIS в этом случае сам передает браузеру правильный код ошибки).

2) для всех остальных страниц сайта сделаем настройку в Kooboo, которая будет выдавать сначала код ошибки браузеру, а затем делать редирект на страницу с ошибкой.

Шаг 1

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

Соответственно дизайну нашего сайта создаем в Kooboo страницу, назовем ее к примеру, "error". На ней размещаем нужную для пользователя информацию, чтобы он не ушел с нашего сайта из-за произошедшей ошибки.

В настройках этой страницы на вкладке "Маршрут URL (URL Route)" в поле "Путь URL (URL path)" добавляем параметр - {status} (через него мы будем передавать код ошибки для метрик и статистики):

set url route for kooboo

Шаг 2

Далее создадим html-файл для редиректа. Назовем его к примеру 404.html. Он будет содержать следующий код:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>404 error</title>
    <meta http-equiv="Content-Type" content="text/html; harset=windows-1251">
</head>
<script language="JavaScript">
<!--
 self.location="/error/404?url=" + self.location;
// --> 
</script>
<body>
Пожалуйста, нажмите <a href="http://mysite.ru">здесь,</a> 
чтобы перейти на главную cтраницу сайта.
</body>
</html>

Здесь главное - это строка:  self.location="/error/404?url=" + self.location;

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

Эта страница делает редирект на красивую страницу с ошибкой "error", которую мы создали в Kooboo (а в адресе параметром идет неверный URL, чтобы метрики могли собрать статистику по подобным обращениям).

Файл 404.html размещаем в корне нашего сайта (т.е. он должен, к примеру, отвечать по адресу http://mysite.ru/404.html).

Шаг 3

Настраиваем IIS для показа страницы 404.html при возникновении ошибки.

Для этого в настройках сайта в IIS переходим по кнопке "Error Pages" и редактируем строку со статусом ошибки 404:

edit custom error page in IIS 7

Мы не может выбрать способы 2 или 3, т.к. они выдают статусы 200. Только первая настройка выдает 404 код ошибки браузеру, но по-умолчанию на уровне IIS 7.5 запрещены абсолютные пути к файлам. Поэтому нужно дополнительно их разрешить.

Установка параметра, разрешающего абсолютные пути для страниц ошибок:

Нужно установить значение true для параметра - allowAbsolutePathsWhenDelegated

Делается это на уровне IIS в "Configuration Editor" на ветке "system.webServer/httpErrors":

allow Absolute Paths When Delegated

Если остановиться на этом этапе, то созданное правило будет работать только на тех файлах и запросах, которые игнорирует kooboo, например mysite.ru/page.html или mysite.ru/pics.jpg (т.к. игнорирование html, рисунков и т.п. по умолчанию указано в роутерах kooboo). В остальных случаях будут стандартные asp-страницы ошибок, типа:

asp.net 404 error

Шаг 4

Теперь на уровне kooboo надо создать страницу (например error_404), желательно на пустом макете, в которой будет только одна строка (создаем представление с этим кодом и добавляем его на страницу):

@{
Response.StatusCode = 404;
}

Страница будет отдавать браузеру нужный статус ошибки.

Шаг 5

Теперь нужно настроить правило обработки этой ошибки в самом kooboo.

В списке настраиваемых ошибок (Custom error) добавляем строку со следующими настройками:

set custom 404 error on kooboo

Сам kooboo при такой настройке не отдает браузеру статус 404, поэтому мы и создали страницу error_404.

Теперь при 404 ошибке внутри kooboo, браузер сначала получит нужный код статуса (400, а не 200, если бы мы ничего не сделали), а затем этот статус перехватывает IIS, делает rewrite на указанный выше файл 404.html, который в свою очередь переадресует пользователя на нормальную красивую страницу ошибки.

Для справки:

  • http://www.iis.net/configreference/system.webserver/httperrors
  • http://serverfault.com/questions/401415/iis-7-returns-http-200-on-custom-404-error-page
  • http://serverfault.com/questions/53712/in-iis-7-how-do-i-set-up-a-default-error-document-for-any-error

©Элла (Автор: Элла С.)

< Предыдущая статья

Причина ошибки "Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information" при обновлении версии

Следующая статья >

Спутник - оптимизация и SEO продвижение сайта в этом поисковом сервисе или Спутник для вебмастера