Как ни странно, но даже с такой простой функцией сайта, как отображать 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", "Страница не найдена");
?>
<p>Например, текст типа .. ошибка 404 </p>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
На верстку можете не смотреть, можно вообще все отсюда спилить и оставить только надпись 404. Главное, чтобы в этом файле присутствовали следующие строки:
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404", "Y");
Дальше, смотрим какая страница отображается вместо 404 страницы, но на этот вариант почему-то все усиленно забивают х@r и начинают писать невероятные функции с событиями или лезут редактировать конфигурационный файл веб-сервера.
Если отображается, например, страница со списком новостей, то значит в вашем файле 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 ошибку.
Количество просмотров: 449
Оригинал статьи был на сайте компании, которой уже нет, как и сайта...