Битрикс. Настройка страницы 404

Как ни странно, но даже с такой простой функцией сайта, как отображать 404 страницу, у Битрикса может возникать множество сложностей, в основном из-за криворукости и дерьмовых готовых решений с Маркетплейса (а их там вагон и тележка).

В большинстве форумов и различных блогах, советует решать эту проблему добавлением событий в файл init.php, прописывать в nginx:

error_page 404 /404.php;

Этот путь решения неверен, чтобы все правильно работало не нужно что-то специально добавлять. Главное найти разобраться и найти причину.

Поехали!

404 страница при отсутствующей странице

Для начала необходимо понять отображается ли 404 страница при запросе на несуществующую страницу или раздел. Набираем несуществующую страницу и видим 404 ошибку, если нет, то в корне сайта отсутствует файл 404.php.

Создаем файл 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("Страница не найдена");
$APPLICATION->SetPageProperty("keywords", "Страница не найдена");
$APPLICATION->SetPageProperty("description", "Страница не найдена");
?>

<div class="container">
  <h1>404</h1>
    <div>
       <?$APPLICATION->IncludeComponent(
         "bitrix:search.form",
         ".default",
             array(
               "COMPONENT_TEMPLATE" => ".default",
               "PAGE" => SITE_DIR."search/index.php"
             ),
         false
         );?>
    </div>

   <p><a href="<?=SITE_DIR?>">Главная страница</a></p>
   <p><a href="/search/map.php">Карта сайта</a></p>

</div>

<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>

На верстку можете не смотреть, можно вообще все отсюда спилить и оставить только надпись 404. Главное, чтобы в этом файле присутствовали следующие строки:

CHTTP::SetStatus("404 Not Found");
@define("ERROR_404", "Y");

Дальше, смотрим какая страница отображается вместо 404 страницы, но на этот вариант почему-то все усиленно забивают х@ и начинают писать невероятные функции с событиями или лезут редактировать конфигурационный файл веб-сервера.

Если отображается, например, страница со списком новостей, то значит в вашем файле urlrewrite.php есть неверная CONDITION**, которая, например она будет выглядеть вот так:

array (
    'CONDITION' => '#^/#',
    'RULE' => '',
    'ID' => 'bitrix:news',
    'PATH' => '/news/index.php',
    'SORT' => 100,
),

Такое происходит потому, что при настройке компонента bitrix:news на странице /news/index.php было указано вот так:

"SEF_MODE" => "Y",
"SEF_FOLDER" => "/",

Меняем на правильный вариант:

"SEF_MODE" => "Y",
"SEF_FOLDER" => "/news/",

Пересохраняем файл правил обработки адресов на странице /urlrewrite.php и страница с ошибкой заработает.

Других ситуаций в принципе возникнуть не может, в nginx если вы используете BitrixVM, ничего менять не надо. Если вы зачем-то сами писали конфиг для nginx, то за появление ошибки отвечают опции:

error_page 404 405 412 502 504 = @bitrix;

или

try_files  $uri $uri/ @bitrix;

Для веб-сервера Apache это строки файла .htaccess:

ErrorDocument 404 /404.php

Для Windows Server правило для 404 ошибки находится в строчках файла web.config:

<httpErrors>
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" path="/404.php" responseMode="ExecuteURL" />
</httpErrors>

404 страница при отсутствующем элементе инфоблока

Тут все еще проще. У стандартных компонентов есть настройки:

"SET_STATUS_404" => "Y", // Устанавливать статус 404
"SHOW_404" => "Y", // Показ специальной страницы

Они и должны быть включены, то есть иметь значение Y или стоять чекбокс, если вы настраиваете в редакторе компонента.

Код ответа сервера 200

В этом случае открываем настройку главного модуля и убираем галку с опции Посылать в заголовке статус 200 на 404 ошибку.

Оригинал статьи был на сайте компании, которой уже нет... как и сайта...

Понравилась статья?