1С-Битрикс - правильная настройка страницы 404

Даже с такой простой функцией сайта, как отображать 404 страницу возникает множество сложностей. В интернете все советует решать эту проблему добавлением событий в файл init.php, прописывать в nginx:

error_page 404 /404.php;

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

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

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

  1. В корне сайта нет файла 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-error-page">
        <div class="error-page-big-text">
            404
        </div>
        <div class="col col-12 ta-center">
                <?$APPLICATION->IncludeComponent(
                    "bitrix:search.form",
                    "bottom",
                    array(
                        "COMPONENT_TEMPLATE" => "bottom",
                        "PAGE" => SITE_DIR."search/index.php"
                    ),
                    false
                );?>
            </div>

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

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

Конечно ваша верстка может отличаться, как и содержимое этой страницы, важно чтобы в этом файл присутствовали следующие строчки:

CHTTP::SetStatus("404 Not Found");
@define("ERROR_404", "Y");
  1. Смотрим какая страница отображается вместо 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/",

Делаем пересоздание правил обработки адресов на странице _/bitrix/admin/urlrewritereindex.php и страница с ошибкой заработает.

Других ситуаций в принципе возникнуть не может, в nginx если вы используете BitrixVM или например конфиг из нашей другой статьи 1С-Битрикс + Nginx + php-fpm + композитный сайт, ничего менять не надо. Если сами писали конфиг для 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 ошибку.