Индивидуальный дизайн для страницы 404ой ошибки
UPD: теперь весь этот мусор ниже можно не читать, а просто скачать модуль и заняться действительно полезным делом ;)
UPD: и ещё он доступен в Marketplace: http://marketplace.1c-bitrix.ru/solutions/refreshlab.err404/
UPD: модуль обновился до версии 1.1.0. Теперь он поддерживает многосайтовость!
UPD: Я больше не занимаюсь Битриксом, модуль не развиваю и, вообще, статья устарела ((
404ая ошибка — это когда сервер не может найти запрошенную страницу. Такое может случиться из-за того, что пользователь неправильно набрал адрес в адресной строке браузера или нужную страницу удалили или куда-то переместили. Так или иначе, нужную страницу сервер показать не может, и об этом он должен сказать пользователю в понятной форме.
В интернете можно найти много статей на тему как именно должна выглядеть страница 404ой ошибки, поэтому этой темы мы касаться не будем. Просто решим, что у нас эта страница должна быть и она должна быть привлекательной, чтобы пользователю, несмотря на ошибку, захотелось остаться на сайте. Например, такой, как на хабре.
Дефолтный вариант
Самый простой вариант — это использовать то, что нам прямо из коробки предлагает битрикс. А предлагает он встраивать сообщение об ошибке прямо в шаблон страницы, которая по идее должна была загрузиться.
Страница не очень привлекательная, перегружена навигацией и прочими управляющими элементами. Обывателю будет не так просто понять, что произошло. Но главное, что страница есть. Посмотрим, как это сделано.
<?php
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
CHTTP::SetStatus('404 Not Found');
@define('ERROR_404', 'Y');
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php');
$APPLICATION->SetTitle('404 Not Found');
$APPLICATION->IncludeComponent(
'bitrix:main.map',
'.default',
Array(
'LEVEL' => '3',
'COL_NUM' => '2',
'SHOW_DESCRIPTION' => 'Y',
'SET_TITLE' => 'Y',
'CACHE_TIME' => '3600'
)
);
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/footer.php');
?>
Это код файла 404.php
, размещённого в корне сайта. Он подключается тогда, когда возникла ошибка. В него можно написать все, что угодно. Нельзя только изменить окружающий дизайн, а именно этого мы и хотим. Едем дальше.
Переадресация
Впервые с проблемой отдельного шаблона для 404ой ошибки я столкнулся тогда, когда на сайте использовалось несколько шаблонов, и не в каждый из них можно было просто так вставить содержимое указанного выше файла. На мой вопрос «как задать отдельный шаблон для 404ой» техподдержка ответила буквально следующее:
- В настройках сайта задайте для страницы
/404.php
свой шаблон сайта. - Внесите изменения в файл
/404.php
<?php include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php'); CHTTP::SetStatus('404 Not Found'); @define('ERROR_404', 'Y'); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php'); if($APPLICATION->GetCurPage() != '/404.php') LocalRedirect('/404.php'); $APPLICATION->SetTitle('404 Not Found'); $APPLICATION->IncludeComponent( 'bitrix:main.map', '.default', Array( 'LEVEL' => '3', 'COL_NUM' => '2', 'SHOW_DESCRIPTION' => 'Y', 'SET_TITLE' => 'Y', 'CACHE_TIME' => '3600' ) ); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/footer.php'); ?>
То есть получается, что при возникновении ошибки пользователь редиректится на нужную нам страницу, для которой мы предварительно задали нужный шаблон. Способ волшебным образом решает нашу проблему, но создаёт новую: в адресной строке пользователь больше не видит адрес ошибочной страницы, теперь у него всегда отображается http://my_domain.ru/404.php
. Некоторое время для меня это неудобство не было критичным и сейчас есть несколько сайтов, где эта ошибка так и выводится, например тут: http://www.boomcard.ru/takoi_stranicy_net (UPD: теперь на новой версии сайта тоже работает мой модуль). Однако прогресс не стоит на месте и нам пора двигаться дальше.
Страница без шаблона
Этот способ первым пришёл не в мою голову, а в голову Wet’а. Заключается он в том, мы вообще не станем подключать шаблон для нашей страницы. Это делается так. Вместо обычного подключения пролога
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/header.php');
и эпилога
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/footer.php');
мы подключим только их служебные части:
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php');
Таким образом, шаблон не подключится совсем. Побочный эффект этого метода — не работают отложенные функции, которые выводят данные в визуальную часть пролога, а это значит, что скрипты, стили и мета-теги нам придётся подключать вручную, зато в теле страницы по-прежнему можно вызывать компоненты и творить прочие безобразия. Таков принцип демонстрирует вот эта страница: http://ex-primo.com/takoi_stranicy_net. Вот теперь мы вплотную приблизились к моему любимому способу.
Отдельный шаблон
Помнишь, дорогой читатель, как мы во втором способе сделали для страницы ошибки отдельный шаблон? Тогда мы привязали его к странице с определённым адресом. Но что мешает привязать его по какому-нибудь другому параметру? Если присмотреться к коду страницы 404.php
, то можно увидеть, что там определяется константа ERROR_404
. Давайте к ней и привяжем шаблон! Для этого в настройках сайта укажем, что наш шаблон будет использоваться при выполнении такого условия PHP:
defined('ERROR_404') && ERROR_404 == 'Y'
Ву а ля! Теперь по любому адресу будет выводиться страница ошибки в её уникальном шаблоне. И шаблон, и саму страницу можно редактировать как обычно, использовать обычным образом компоненты и подключать скрипты. Именно так работает страница 404ой ошибки на сайте, работу над которым я недавно закончил:
Вот и сказке конец, а кто слушал — огурец :)
UPD. Шаблон для несуществующих секций и элементов.
В комментах было верно подмечено, что в некоторых случаях битрикс не может вывести нужный нам шаблон 404ой ошибки. Это случается, когда такую ошибку возвращает компонент, находящийся на странице. И действительно, код компонента срабатывает уже после выбора шаблона страницы, поэтому всё, что ему остаётся, это вывести сообщение об ошибке прямо в область контента. В итоге мы видим неказистую страницу с надписью «Элемент не найден» или «Раздел не найден».
Как убрать эту надпись, а заодно и весь окружающий дизайн, заменив его нашим красивым шаблоном? Нам поможет событие OnEpilog
, которое возникает в самом конце выполнения страницы. В его обработчике мы очистим буфер, который был так старательно сгенерирован всеми компонентами, расположенными на странице, и заменим его страницей ошибки. Обработчик будет выглядеть так:
function handler404(){
if(defined('ERROR_404') && ERROR_404 == 'Y'){
$template = 'er404';
global $APPLICATION;
$APPLICATION->RestartBuffer();
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
include $_SERVER['DOCUMENT_ROOT'].'/404.php';
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';
}
}
Здесь мы сначала сбрасываем буфер, а потом вручную подключаем header нашего шаблона, файл ошибки и, наконец, footer шаблона.
Замечу, что этот способ будет работать для любых ошибок, при генерации которых устанавливается константа ERROR_404
в значение Y
. Так что, если вы решили воспользоваться этим способом, то использовать предыдущий для обычных страниц уже нет необходимости.
Хотя даже так не получится, ведь хотя компоненты каталога при ЧПУ делают @define("ERROR_404","Y"), происходит-то это уже после подключения хэдера.
Но у меня есть идея, как это побороть :) Напишу, как только опробую.
IMHO во-первых, можно и нужно написать более срогий шаблон в /urlrewrite.php. Ну а дальше, видимо, $APPLICATION->RestartBuffer() и подключаем /404.php (только не знаю, как повторное подключение шаблона проведется).
В ближайшее время сам планирую заняться решением этого вопроса.
URL страницы информационного блока: /papka/
URL страницы раздела: /papka/#SECTION_CODE#/
URL страницы детального просмотра: /papka/#ELEMENT_CODE#.html
Модуль не срабатывает в следующих случаях
http://site/papka/qwqwqwqwqw
http://site/papka/#SECTION_CODE#/qwqwqwqwqw
http://papka/#ELEMENT_CODE#.htmlqwqwqwqwqw
Хотя сервер во всех случаях оттдает 404
Так же есть форум на отдельном домене (у нас многосайтовость) - с поддержкой ЧПУ по умолчанию - на нем модуль вобще не срабатывает
Спасибо!
Простите, что так поздно отвечаю, был в отпуске. Проблема в компоненте bitrix.news. Он, когда не находит секцию или элемент, как описано в вашем случае, отображает все элементы, отдаёт 404 заголовок, но не устанавливает константу ERROR_404. Другие компоненты, на которые я ориентировался, когда писал модуль, эту константу устанавливают.
Самое быстрое решение в вашей ситуации — кастомизовать копонент, чтобы он устанавливал нужную константу. А самое правильное решение — это переписать модуль, чтобы он реагировал не на константу, а на отправленные юзеру заголовки, но я не знаю возможно ли это, безопасно ли и когда на это найду время.
2 Александр
К сожалению, Marketplace еще не научился устанавливать модули сразу с последними обновлениями, а без них модуль действительно не работает. Это моя вина, я такого поведения от Marketplace не ожидал. Обновите модуль вручную (Настройки - Marketplace - Сторонние обновления) и всё будет хорошо.
Скачал модуль, поставил, не сработал ни разу, может, то что 2 сайта.
Потом удалил модуль и в настройки сайтов поставил условие defined('ERROR_404') && ERROR_404 == 'Y'
настроил, что по вашему методу - по ошибке загружался шаблон "404". Сама идея очень хорошая.
шаблон 404 отказывался работать с $APPLICATION->ShowTitle
$APPLICATION->ShowHead
$APPLICATION->ShowPanel
в итоге удалил, решил все сделать заново. В редактировании шаблона в пред просмотре всё как надо, но сайт отказывает редиректить и имею либо стандатный шаблон, либо белый экран.
Можно вопрос, по последнему варианту, который работает во всех случаях, файл 404.php остается стандартным?
Буду очень благодарен за помощь.
matthew (a) tlc60.ru
Вопросов у вас много, буду отвечать по порядку.
1. Про модуль. Чтобы модуль заработал, его надо обновить до версии 1.0.1. В 11 версии битрикс наконец научился устанавливать обновления автоматически, а раньше их надо было ставить вручную. Проверьте, может у вас просто старая версия.
2. Теперь про подключение шаблона по условию. Это самый что ни на есть стандартный функционал битрикса. И если ShowHead у вас работает в других шаблонах, то должен работать и в этом. Могу только посоветовать проверить, нет ли ошибок в само шаблоне. И еще вариант – быть может, у вас компоненты на странице сбрасывают буферизацию. Кстати, белый экран тоже говорит об ошибках. Посмотрите логии сервера.
3. Про файл 404.php. Во всех случаях подключается файл 404.php из корня сайта. Специально в него изменения не вносятся, но если хотите – настройте под себя.
мучил при указании в настройках сайта - шаблону ошибок - defined('ERROR_404') && ERROR_404 == 'Y'
при ошибке стало перенаправлять на шаблон ошибки, но подключая стили от основного шаблона,
когда полностью удалил $APPLICATION->ShowTitle
$APPLICATION->ShowHead и $APPLICATION->ShowPanel
произошло второе чудо, стили основного шаблона отключились и подключились стили шаблона ошибок. На этом я пока и остановился.
Обновляться не буду.
Модуль позволяет задать шаблон 404ой ошибки для отсутствующих элементов инфоблоков, секций и т.п. 1.0.0
автоматом не обновляется, и хорошо видимо :)
битрикс последний 11
Я вчера после вашего сообщения специально пошел на демо-площадку битрикса и там всё проверил. Работает.
Если у вас установлен модуль, то делать настраивать шаблон через defined('ERROR_404') && ERROR_404 == 'Y' уже нет необходимости.
Модули здесь и в marketplace по сути одно и то же, но называются немного по-разному, поэтому скаченный отсюда модуль не будет обновляться через MP.
Совсем избежать редиректа можно, если использовать какой-нибудь другой способ вывода страницы ошибки из статьи, или если использовать модуль.
нашел функцию head("Location: /404.php")
исправил на head("HTTP/1.1 404 Not Found")
Зашел на http://mainspy.ru/otvet_servera ,действительно,сервер выдает 404 ошибку.
)))Теперь другая проблема: на моем сайте, при запросе несуществующей страницы,не
включается 404.php
А использовать модуль просто: устанавливаете его из маркетплейс (http://marketplace.1c-bitrix.ru/solutions/refreshlab.err404/), обновляете до последней версии, выбираете шаблон и всё, он работает. Но ваш файл gkcatalog.php нестандартный, я не знаю, что он делает, могут возникнуть конфликты.
if(defined('ERROR_404') && ERROR_404 == 'Y' && !defined('ADMIN_SECTION'))
Иначе при 404 ошибке в админке будут косяки.
В ближайшем обновлении добавлю.
http://nechipuruk.blogspot.com/
Проблема:
Вместо 404, отображается пустая страница
Буду рад любой помощи
<?
function handler404(){
if(defined('ERROR_404') && ERROR_404 == 'Y'){
$template = 'er404';
global $APPLICATION;
$APPLICATION->RestartBuffer();
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
include $_SERVER['DOCUMENT_ROOT'].'/404.php';
include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';
}
}
?>
убрала содержимое и вставила код события OnEpilog- отобразился белый экран,
если возможно-поясните мне пож-та. Спасибо.
1. Функцию handler404() сохраните в файле /bitrix/php_interface/init.php.
2. В том же файле установите эту функцию в качестве обработчика события OnEpilog. Как это сделать посмотрите в документации, мои знания в этой области уже немного устарели.
3. В файле 404.php оставьте только текст ошибки, никаких функций не надо.
Изготовление, установка, доставка. Печи на дровах Буржуйки! По доступным ценам!
https://gorodmaster.top/pech-t
Отличным украшением парка или садового участка станут кованые качели.
https://gefest.od.ua/stati/ka4eli.html
Благодаря большому выбору моделей как сварных, так и кованых калиток Вы легко сделаете свой выбор.
https://gorodmaster.top/kalitki
https://gefest.od.ua/stati/stolikiritual.html