404 страница в комплексном компоненте 1С Битрикс
Вы наверняка сталкивались с проблемой когда при обращении к несуществующему адресу в каталоге товаров или в разделе новости, вместо 404-й страницы получали ответ «не найден раздел или элемент» при этом серверу в заголовка отдавался статутс 200 ok а не 404 not found. Это не правильно, т.к. поисковик может проиндексировать пустые страницы которые впоследствии повысят количество отказов при заходе реальных посетителей на сайт. И так почему так происходит и как этого избежать.
В первую очередь нам нужно проверить наличие некоторых фалов и настроек на сайте.
Проверка сайта и настройка 404-й страницы
Во-первых проверим наличие файла 404.php который должен лежать в корне вашего сайта. Если его нет, можете его создать с таким содержимым:
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-й.
Во-вторых, проверьте файл .htaccess (если он поддерживается вашим сервером), в нём должна присутствовать такая директива:
ErrorDocument 404 /404.php
Теперь перейдите к настройкам вашего компонента (обычно это bitrix.catalog или bitrix.news), блоке «настройки 404 ошибки» отметьте галочку «Устанавливать статус 404» (название галочки может отличаться в компонентах, в некоторых она называется «Устанавливать статус 404, если не найдены элемент или раздел:»).
Затем в файл /bitrix/php_interface/init.php (или /local/php_interface/init.php) добавьте следующий код:
GetCurPage(), $page_404) === false && defined("ERROR_404") && ERROR_404 == "Y") < $APPLICATION->RestartBuffer(); CHTTP::SetStatus("404 Not Found"); include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php"); include($_SERVER["DOCUMENT_ROOT"].$page_404); include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php"); die(); > >
Этим кодом, мы добавляем в OnEpilog свой обработчик события, который считывает установленный компонентом параметр ERROR_404 и запускает перегрузку буфера подключая файл 404-й страницы. Обычно это 404.php лежащий в корне сайта. Хотя при соответствующем оформлении 404-й страницы, можно (даже будет лучше) не подключать файлы header.php и footer.php.
Если после всех манипуляций 404-я страница не отображается по несуществующему URL, следует проверить файл urlrewrite.php отвечающий за обработку ЧПУ адресов. Иногда, например при размещении компонента умного фильтhа (catalog.smart.filter) на главной странице, в urlrewrite.php прописывается условие, что-то вроде этого:
"#^/([a-zA-Z]+)/([0-9]+)/#", "RULE" => "", "ID" => "bitrix:catalog.section", "PATH" => "/index.php", ),
Обычно в CONDITION — создаётся некорректное регулярное выражение, которое срабатывает на все страницы, в том числе и на не существующие и вместо 404-й страницы, сайт выдаёт что-то ещё, обычно страницу или компонент указанный в PATH этого правила. Если такое правило есть, его необходимо скорректировать или удалить из urlrewrite.php.
Ошибка элемент/раздел не найден
Такая ошибка возникает когда шаблоны ЧПУ в инфоблоке и в настройках компонента не совпадают. Или же пользователь ввёл некорректный URL близкий к шаблону. Проверьте настройки инфоблока:
И настройки ЧПУ в компоненте (обычно комплексном):
Так же следует проверить соответствие шаблона и свойств элемента. Например в примере в шаблон URL детальной страницы входит символьный код элемента #ELEMENT_CODE#, если у элемента нет символьного кода, вы получите ошибку. Но правильнее конечно, не показывать такие сообщения (элемент не найден, раздел не найден), компонент должен установить статус 404 и должен сработать скрипт показывающий пользователю /404.php с соответствующим ответом в заголовке. В противном случае, могут быть проблемы с SEO сайта.
Оформляем 404-ю страницу
По умолчанию 404.php в 1С Битрикс содержит компонент карты сайта и выводит список ссылок взятый из файлов формирования меню. При этом на странице так же остаётся полноценная шапка и подвал сайта (отрабатывают header.php и footer.php шаблона), что на мой взгляд не правильно. Кстати сеошники из компании Кокос, с которыми мне приходилось сталкиваться, так же не рекомендовали выводить шапку и подвал с полноценной навигацией по сайту на 404-й странице.
На мой взгляд 404-я должна говорить пользователю что он всё ещё на том же сайте где и был секунду назад, отвечать на вопрос почему он здесь и что делать дальше и отдавать соответствующие заголовки поисковому роботу.
И так давайте выведем 404-ю страницу битрикс без шапки и подвала, но при этом подтянем ядро системы, чтобы мы могли подключить стили шаблона по средствам константы SITE_TEMPLATE_PATH. Убираем всё лишнее, подключаем ядро, получаем такой файл:
Чтобы посетитель не подумал что он покинул ваш сайт, стили оформления 404-й страницы должны быть такими же как и на всём сайте (заголовки, шрифты, цвета, иконки, картинки). Обязательно (минимально) на этой странице должен быть логотип.
Я люблю когда сообщения об ошибках читаются сразу, поэтому пишу их большими шрифтами, например Open Sans Condensed, не мельчите и объясняйте пользователю куда он попал и что ему дальше делать (вернуться на главную страницу, сделать запрос в форме поиска, в конце концов позвонить или написать вам). У меня получилась такая страничка:
404 Страница не найдена Возможно запрашиваемая вами страница была удалена или перемещена. Вернуться на главную? позвоните нам: +7 (999) 000 - 00 - 00 или напишите на e-mail: example@mail.ru
Добавим немного CSS стилей для полноты картины:
.container404 < text-align: center; width: 1200px; margin: 0 auto; margin-top: 100px;>.container404 img < display: block; margin: 0 auto; margin-bottom: 50px; >.container404 a < color: #F0A229; >.container404 a:hover < text-decoration: none; >.title404 < font-family: 'Open Sans Condensed', sans-serif; font-size: 60px; line-height: 80px; display: block; >.subtitle404 < font-family: 'Open Sans Condensed', sans-serif; font-size: 40px; line-height: 60px; display: block; >.description404 < font-family: 'Open Sans Condensed', sans-serif; font-size: 30px; line-height: 40px; display: block;>.contacts404 < margin:0 auto; width: 800px; padding: 10px 0px 100px 0px; font-family: 'Open Sans Condensed', sans-serif; font-size: 30px; line-height: 40px; >.phone404
Вроде бы всё. Ах да чуть не забыл! Нужно проверить всё ли правильно отдаётся поисковому роботу. Для этого перейдите на сайт, вызовете консоль разработчика (обычно клавиша F12 или пункт в меню инструментов браузера «инструменты разработчика» или что-то подобное), перейдите на вкладку Сеть/Network введите адрес несуществующей страницы и посмотрите какой ответ вернёт сервер (вкладка Status):
Как видите всё в порядке, сервер вернул 404-й заголовок, что означает — страница не существует, а следовательно поисковик не проиндексирует ненужные адреса и в поиск попадут только реально существующие документы вашего сайта. Теперь точно всё. Желаю удачи!
Подключаем единую страницу 404 ошибки для всего сайта в 1С-Битрикс
18.09
Как подключить 404 страницу в 1С-Битрикс. Подключаем единый шаблон
В 1С-Битрикс на страницу с 404 ошибкой можно попасть только тогда, когда не найден физический раздел сайта, то есть папка. Если же вы не так указали адрес динамического раздела каталога, например, или карточки товара, то вы просто получите красные надписи «Раздел не найден» и «Элемент не найден».
Но что делать, если необходимо любой 404 ответ обрабатывать в едином стиле? На помощь нам приходят нехитрые инструкции, которыми мы и воспользуемся.
Все манипуляции мы будем совершать в файле init.php, который расположен по адресу /bitrix/php_interface/. Если по данному пути у вас нет такого файла, то придется его создать.
После чего нужно определиться, будет ли наша страница с ошибкой в стиле сайта, или она будет полностью иметь свой собственный стиль.
Страница 404 в стиле сайта
Начнем с первого варианта. Для этого откроем init.php и запишем туда следующий код:
AddEventHandler(
"main"
,
"OnEpilog"
,
"My404PageInSiteStyle"
);
function
My404PageInSiteStyle()
if
(defined(
'ERROR_404'
) && ERROR_404 ==
'Y'
)
global
$APPLICATION
;
$APPLICATION
->RestartBuffer();
include
$_SERVER
[
'DOCUMENT_ROOT'
].SITE_TEMPLATE_PATH.
'/header.php'
;
include
$_SERVER
[
'DOCUMENT_ROOT'
].
'/404.php'
;
include
$_SERVER
[
'DOCUMENT_ROOT'
].SITE_TEMPLATE_PATH.
'/footer.php'
;
>
>
Итак, что же делает код выше. Во первых, мы повесили обработчик на событие OnEpilog, то есть на тот момент, когда страница уже будет обработана и скомпонована. В нем мы указали название нашей функции My404PageInSiteStyle, которая будет отвечать за вывод текста 404 ошибки.
Далее мы переходим непосредственно к нашей функции. Что же там происходит. Сначала мы проверяем, была ли определена константа, которая указывает на то, что запрашиваемое содержимое не найдено - ERROR_404. Если такая константа имеется, то мы делаем следующее:
- Перезапускаем буфер, чтобы полностью очистить текущую компоновку и сформировать новую;
- Подключаем header.php нашего шаблона;
- Подключаем файл 404.php в котором хранится некий наш контент, - будь то текст или картинка, - который оповестит пользователя, что такой страницы нет;
- Подключаем footer.php нашего шаблона;
Затем прогружается вновь сформированная страница в стиле нашего сайта, в контентной части которой будет выведен текст из файла 404.php. Этот файл может лежать где угодно, называться как угодно. Но привычнее называть его именно так и хранить в корневой директории сайта.
Страница 404 с индивидуальным дизайном
В последнее время многие стали делать страницу с 404 ошибкой в собственном оформлении, не привязываясь к стилю сайта. Собственно, мой блог не исключение.
Зачем это делается? Если рассматривать этот аспект с точки зрения продвижения, то это делается для того, чтобы направить пользователя на нужные разделы или страницы, если он каким-то образом случайно попал на несуществующую страницу.
На такой странице оптимизаторы проставляют ссылки, чтобы человек не ушел, а продолжил посещение сайта.
Но также это делается, чтобы просто не нагружать посетителя ненужной информацией и не вводить в ступор. Порой бывает заходишь на сайт, кликаешь по интересующей ссылке и попадаешь на какую-то странную страницу. И вроде бы ты на сайте, вроде бы ошибок нет, но информацию ты никакую не получил. Вот и ищешь глазами, начинаешь смотреть, искать. И не находишь. Естественно желание вновь возвращаться на такой сайт резко пропадает.
Чтобы посетителю конкретно указать, что он попал на несуществующую страницу, ее и стараются выделить каким-то индивидуальным дизайном, чтобы "встряхнуть" посетителя и дать понять, что он забрел куда-то не туда.
Давайте немного модифицируем код выше, для того, чтобы у нас была возможность делать свои собственные страницы с 404 ошибкой не в стилях сайта.
AddEventHandler(
"main"
,
"OnEpilog"
,
"My404PageInMyOwnStyle"
);
function
My404PageInMyOwnStyle()
if
(defined(
'ERROR_404'
) && ERROR_404 ==
'Y'
)
global
$APPLICATION
;
$APPLICATION
->RestartBuffer();
include
$_SERVER
[
'DOCUMENT_ROOT'
].
'/404.php'
;
>
>
Как видите, все очень просто. Мы всего лишь убрали подключение header.php и footer.php, тем самым шаблон нашего сайта не будет грузиться. А загрузится только содержимое файла 404.php.
Правила оформления файла 404.php в 1С-Битрикс
Когда мы определились с тем, как будет выглядеть наша страница 404 ошибки, необходимо ее подготовить.
Самое важное здесь - это установить статус 404 ошибки, иначе страница вам будет выдаваться с кодом ответа 200 ОК, что есть совсем нехорошо.
Вот та минимальная программная часть, которая должна быть указана в начале файле 404.php:
require
$_SERVER
[
"DOCUMENT_ROOT"
].
"/bitrix/modules/main/include/prolog_before.php"
;
include_once
(
$_SERVER
[
'DOCUMENT_ROOT'
].
'/bitrix/modules/main/include/urlrewrite.php'
);
CHTTP::SetStatus(
"404 Not Found"
);
@define(
"ERROR_404"
,
"Y"
);
?>
Что тут происходит:
- Здесь мы подключаем файл prolog_before.php, чтобы, если понадобится, мы могли пользоваться различными переменными, константами и методами 1С-Битрикс. Например, подключить модуль информационных блоков и положить сюда компонент по выводу случайных элементов;
- Далее мы подключаем файл urlrewrite.php, который будет обрабатывать наш урл;
- После этого самое важное - мы устанавливаем статус и заголовок ответа 404 Not Found;
- И на всякий случае еще раз определим константу 404 ошибки. А чтобы не было ошибок, поставим перед ней собачку;
После этого вы можете уже верстать 404 страницу как вам угодно. Вот вам небольшая "рыба" заготовка:
html
>
head
>
meta
charset
=
"UTF-8"
>
title
>Страница не найдена
title
>
link
rel
=
"shortcut icon"
href="/favicon.ico" />
style
type
=
"text/css"
>
.container
width: 1170px;
margin: 0 auto;
>
style
>
head
>
body
>
div
class
=
"container"
>
img
src
=
"/images/404.jpg"
>
br
/>
p
>Ой ой ой! СТраница не найдена!
p
>
div
>
body
>
html
>
Ну вот, теперь вы легко сможете создавать в 1С-Битрикс любые страницы 404 ошибки, какие только захотите.
База знаний
Ошибка может возникать при изменении ЧПУ каталога. Пример ошибки для посадочной страницы.
Генерируем посадочную страницу.
После перехода на нее появляется ошибка.
ЧПУ в настройках умного SEO должны совпадать с настройками ЧПУ каталога. К примеру, если в умном SEO в строке URL будет указано #SECTION_CODE_PATH#, а в каталоге — #SECTION_CODE#, появится 404 ошибка. Если параметры будут совпадать — переход на страницу состоится без ошибок.
#SECTION_CODE_PATH# — стоит по умолчанию. Если в каталоге прописан другой параметр, замените его на #SECTION_CODE#.
Заново сгенерируйте страницы и сбросьте кеш сайта. После этого откроется посадочная страница.
Bitrix и ошибка 404
Давно бились над проблемой с SEO и применением стандартных комплексных компонентов (bitrix:news, bitrix.catalog) при использовании ЧПУ.
Проблема заключалась вот в чем: при отдаче страницы с отсутствующим элементом или секцией инфоблока выставляется статус "404 Not Found" (в теле компонентов bitrix:news.list, bitrix:news.detail, bitrix:catalog.section, bitrix:catalog.element есть соответствующие строки, но к сожалению не было способа показать тело 404-ой страницы (мы обычно создаем страницу /404.php) с ее оформлением и пр.
Поначалу нас устраивал редирект на эту страницу вида:
LocalRedirect("/404.php", "404 Not Found");
но чтобы им воспользоваться приходилось создавать дубликаты компонентов в своем пространстве имен (anima:catalog.section, например).
[spoiler]
Потом было найдено более изящное решение, не задевающее компоненты. В стандартных компонентах используется определение константы ERROR_404 в случае проблем с поиском инфоблока, секии, элемента во время выполнения компонента, но по заверениям разработчиков она используется исключительно для статистики. Однако, отображение стрницы – единый runtime и определенные константы можно использовать практически в самом его (runtime-a) конце. Результатом этих роазмышлений стал код в init.php:
/* Неочевидное перенаправление на страницу 404-ой ошибки */ AddEventHandler("main", "OnEpilog", "Redirect404"); function Redirect404() < if(defined("ERROR_404") ) < LocalRedirect("/404.php", "404 Not Found"); >>
Довольно легко для понимания и универсально и работает везде, но. У данной конструкции (у редиректа) естьи темные стороны.
- Пользователь сайта, случайно вбив ошибочный длинный URL перебрасывался на /404.php без возможности увидеть и исправить ошибку в строке адреса.
- Поисковой робот, придя на ошибочную страницу видел странную последовательность: при обращении к несуществующей странице он получал статус 301 Moved Permanently (в редких случаях "404 Not found" и переадресацию на страницу /404.php, которая выставляла статус "404 Not found". Немного путано.
Тогда появилась идея: в функции Redirect404() очистить буфер вывода с помощью $APPLICATION->RestartBuffer(); и "заинклюдить" /404.php. Но тут на словах оказалось проще, чем на деле. Беда крылась в том, что пролог и эпилог сайта вызываются через конструкцию require_once и повторно вызвать их (для отображения шапки, футера, стилей на заветной 404-ой странице) оказалось невозможно; другими словами мы теряли, к примеру, меню, вставленное в визуальную часть пролога (header.php шаблона).
Путем экспериментов, проб и ошибок мы пришли к довольно универсальной записи:
AddEventHandler("main", "OnEpilog", "Redirect404"); function Redirect404() < if( !defined('ADMIN_SECTION') && defined("ERROR_404") && defined("PATH_TO_404") && file_exists($_SERVER["DOCUMENT_ROOT"].PATH_TO_404) ) < //LocalRedirect("/404.php", "404 Not Found"); global $APPLICATION; $APPLICATION->RestartBuffer(); CHTTP::SetStatus("404 Not Found"); include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php"); include($_SERVER["DOCUMENT_ROOT"].PATH_TO_404); include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php"); > >
Внимательный зритель заметит, что в функции появилась константа PATH_TO_404. Определять данную константу предлагается первой строкой в визуальной части пролога:
Кстати, переменная $bIndexPage может сослужить полезную службу при выводе шаблона с различными наборами компонентов на главной и внутренних страницах при единообразии прочего содержимого и стилей.