Добрый день! Не могу настроить 404 страницу в комплексном компоненте bitrix.news. В компоненте поставил галочку "Устанавливать статус 404 если не найден элемент или раздел", у компонента включен ЧПУ ( http://joxi.ru/zbYGVIwyTJA5A_en4bg ). В Init.php прописал
Код
//404 страница в комплексных компонентах
AddEventHandler("main", "OnProlog", "_Check404Error",1);
function _Check404Error()
{
global $APPLICATION;
$cp = $APPLICATION->GetCurPage();
if ((defined('ERROR_404')) && (ERROR_404=='Y'))
{
$APPLICATION->RestartBuffer();
CHTTP::SetStatus("404 Not Found");
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
require ($_SERVER["DOCUMENT_ROOT"]."/404.php");
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
die();
}
}
AddEventHandler("main", "OnEpilog", "Redirect404");
function Redirect404() {
if(
!defined('ADMIN_SECTION') &&
defined("ERROR_404") &&
//defined("PATH_TO_404") &&
file_exists($_SERVER["DOCUMENT_ROOT"]."/404.php")
) {
//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"]."/404.php");
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
}
}
ни то ни то не работает. =( Чё не так делаю?
P.S. причём даже со стандартным шаблоном если набрать в адресе не существующую страницу, ошибки (как это обычно бывает) "Раздел не найден" или "Элемент не найден" - не выдаёт!
После обновления проблема частично решилась, заработал код в init.php + 404 стала отрабатвать если набрать адрес несуществующей новости с .html на конце URL. Если просто ввести /novosty/ввамвмававива - не прокатывает. Разделов в инфоблоке вообще нет, только элементы.
Копаем глубже. Та же проблема с 404 на комплексном компоненте у которого ести и разделы и подразделы и элементы (bitrix:catalog) поместил в файлы sectin.php и element.php после вызова компонентов catalog.section и catalog.element соответственно, такой код:
Код
<? //Уходим на 404 страницу
global $APPLICATION;
if ((defined('ERROR_404')) && (ERROR_404=='Y'))
{
$APPLICATION->RestartBuffer();
CHTTP::SetStatus("404 Not Found");
$APPLICATION->SetPageProperty("class_center", "error_page_content"); //Это мне нужно для стилей в header.php на 404 странице
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
require ($_SERVER["DOCUMENT_ROOT"]."/404.php");
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
die();
}
?>
шаблон URL адресов настроен так: для разделов /#SECTION_CODE#/ для элементов /#SECTION_CODE#/#ELEMENT_CODE#.html если обратиться к несуществующим разделам или страницам соблюдая данный шаблон, например .../catalog/abrakadabra/ или .../catalog/abrakadabra/blablabla.html - код отрабатывает, в ответе сервера нет никакх редиретов и пр. вам просто покажет 404 страницу с соответствующим статусом в ответе. Но если нарушить габлон, и обратиться например к .../catalog/abrakadabra - т.е. без слеша на конце - 404 страница не отрабатывает. Я вижу список всех разделов. Битрикс ведь ничего не нашёл, ни раздел ни элемент, почему же не отдать 404 ? Как можно настроить такое поведение (желательно без кастомизации комплексного компонента) ?
Вот верная настройка 404 страницы, специально написали эту статью, чтобы раз и навсегда закрыть эту тему, так как это одна из самых распространенных ошибок:
Александр Лыженков, мужик ты издеваешься? Тут свой сайт впихнул, на тостере тут ответил https://toster.ru/q/445881 тут https://toster.ru/q/535732 эти вопросы старые и давно решённые. У тебя 33 сообщения на форуме 1С Битрикс где ты рекламируешь свою статью про верную настройку 404-й страницы, ты где SEO изучал вообще? =)
В итоге, есть ответ на то, как в категории сделать http заголовки 404 у страниц 404?? Страницу 404.php отображает корректно, но в категориях http ответ 200 Ок
<?
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->AddChainItem("Страница не найдена");
$APPLICATION->SetPageProperty("body_class", "page-404");?>
html контент с текстом 404
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
При этом, такое наблюдается только на страницах с комплексным компонентом, как понимаю. например site.ru/catalog/ni4ego - страница ошибки 404, но статус 200, а обычная страница site.ru/contacts_net - страница 404 и статус 404
Проверьте ещё файл в корне urlrewrite.php возможно у вас там создано не верное правило разбора урлов и несуществующую страницу это правило "разбирает" подтягивая какой-нибудь index.php и возвращая при этом статec 200 ok. А лучше сюда скиньте содержимое urlrewrite.php.
возможно проблема в том, что рулрерайт неравильно определяет страницу, сортировка обработки адресов строится по максимльному пути регекс-паттерна, поэтому чтобы искусственно завысить нужный паттерн в обработчике к которому обращается скрипт обработки урлов, для паттерна можно прописать конструкцию, которая его удлиняет, например комментарий
Код
/novosty/ввамвмававива - не прокатывает.
потому что скорее всего у вас обрабатывается не страница /novosti/bla.html а что-нибудь из-разряда более жадного паттерна, поэтому можетете изменить этот паттерн на
Ничего не изменилось. catalog/fignia 200 catalOK/ 404 catalOK/fignia 404
Может ли это быть связано с настройками того, что товары могут располагаться в разных категориях, и catalog/section1/tovar может быть доступен и по catalog/fdsf/tovar ? но при этом catalog/section1/tovar и catalog/section1/fignia - оба 200, хотя второго товара не существует