Даже с такой простой функцией сайта, как отображать 404 страницу возникает множество сложностей. В интернете все советует решать эту проблему добавлением событий в файл init.php, прописывать в nginx:
error_page 404 /404.php;
но все эти пути решения неверные, чтобы все правильно работало не нужно что-то специально добавлять. Давайте попробуем с этим разобраться основательно.
404 страница при отсутствующей странице
Для начала необходимо понять отображается ли 404 страница при запросе на несуществующую страницу или раздел. Набираем несуществующую страницу и видим 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("Страница не найдена");
$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");
- Смотрим какая страница отображается вместо 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 ошибку.
Оригинальная статья у нас на сайте https://onlinebd.ru/blog/1s-bitriks-pravilnaya-nastroika-stranicy-404