Вызвать 404 ошибку битрикс

 

Здравствуйте.

На странице сайта выделяется часть УРЛ как символьный код элемента инфоблока. Сам инфоблок ищется вручную при помощи функции GetIBlockElementList(). Если эта функция возвращает false, то надо вернуть 404 ошибку.

Как ее вызвать ?

Подскажите, пожалуйста.

 

Пользователь 14571

Эксперт

Сообщений: 787
Баллов: 104
Регистрация: 10.08.2007

#2

0

03.04.2010 22:33:22

Код
<?php
header("HTTP/1.0 404 Not Found");
?>

или есть битрикс-API  функция для этого. Можно в мануале посмотреть.

мои проекты: https://blog.sokov.org/category/dhynedhdhudhnn/ | меня рекомендуют: https://blog.sokov.org/recommendations/ | обо мне: https://spb.hh.ru/resume/9f303161ff02e561e20039ed1f654846726333 | 1 час работы — 1200 руб.

 

CHTTP::SetStatus(«404 Not Found»);
@define(«ERROR_404″,»Y»);

Техдиректор — оперативная служба технической поддержки сайтов на Битриксе

 

Виталий
Евгений Неверов

Спасибо.

Но хочется сделать так, чтобы не только посылался заголовок ответа (404 Not Found), но показывалась вместо текущей страницы страница предназначенная для 404 ошибки.

Просто сейчас загружается страница с пустой контентной областью, а необходимо показать страницу предназначенную для 404 ошибки. Т.е. отменить вывод текущей страницы и вместо нее выдать страницу с описанием ошибки.

 

Редиректните тогда просто на страницу 404.php . Зачем вам тогда 404-я ошибка?

 

Пользователь 60679

Заглянувший

Сообщений: 7
Регистрация: 26.03.2010

#6

1

04.04.2010 11:29:17

Пока решил задачу таким образом:

Код
$item = $items->GetNext();
if (!$item)
{
   CHTTP::SetStatus("404 Not Found"); 
   @define("ERROR_404","Y");
   
   $rsSites = CSite::GetByID(SITE_ID);
   $arSite = $rsSites->Fetch();
   include($arSite['DOC_ROOT']."/404.php");
   return;
}

Оформил ввиде отдельной функции, которую залил в /bitrix/php_interface/ID_сайта/init.php

 

нормальное решение. :)

 

А вот интересно, можно ли как-то узнать, вызывалась ли команда CHTTP::SetStatus(«404 Not Found»); на странице ранее?

 

Пользователь 482727

Заглянувший

Сообщений: 7
Регистрация: 04.02.2016

#9

0

01.06.2016 16:03:56

Цитата
Евгений Неверов написал:
CHTTP::SetStatus(«404 Not Found»);
@define(«ERROR_404″,»Y»);

Походу за 6 лет чет изменилось? Не работает.
Есть идеи?

 

Пользователь 27542

Эксперт

Сообщений: 583
Баллов: 127
Регистрация: 28.07.2008

Какое еще пояснение?

#10

7

01.06.2016 16:35:12

Если нужно вызвать полностью 404 страницу с очисткой всего выведенного уже в рабочей области (а не только HTTP статус установить), то можно так:  

Код
if (!defined("ERROR_404"))
   define("ERROR_404", "Y");

\CHTTP::setStatus("404 Not Found");
   
if ($APPLICATION->RestartWorkarea()) {
   require(\Bitrix\Main\Application::getDocumentRoot()."/404.php");
   die();
}

 
 

компоненты, модули · адаптивный форум · свойства-таблицы

Очень часто сео-специалисты ставят задачу как можно сильнее упростить адрес до карточки товара и до карточки раздела и как результат мы получаем шаблон адреса вида: /раздел/  и /товар/. В таком случае типовой компонент catalog при включенном режиме отдачи 404-й ошибки, будет выдавать ошибку. Чтобы этого избежать, нужно вносить правки в логику отображения.

Для начала отключаем режим показа 404-й страницы в настройках компонента каталога.

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

if (!defined("ERROR_404"))
	define("ERROR_404", "Y");

\CHTTP::setStatus("404 Not Found");

if ($APPLICATION->RestartWorkarea())
{
	require(\Bitrix\Main\Application::getDocumentRoot() . "/404.php");
	die();
}

В результате пользователю будет показана 404-я страница. Адрес при этом не изменится.

2019-02-28. Решение, используемое в ядре системных компонентов:

Bitrix\Iblock\Component\Tools::process404(
       'Не найден', //Сообщение
       true, // Нужно ли определять 404-ю константу
       true, // Устанавливать ли статус
       true, // Показывать ли 404-ю страницу
       false // Ссылка на отличную от стандартной 404-ю
);

Типовой каркас 404-й страницы:

<?
	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"); ?>

Есть инфоблок со списком поддоменов.
Если зайти на поддомен, которого нет в этом списке, должен отдаваться статус 404.

Нижеприведённый код работает на всём сайте, кроме главной страницы.
К примеру, a.vsesvetodiody.ru/dileram.html — правильно отдаёт 404, а просто a.vsesvetodiody.ru выдаёт пустую страницу, хотя скрипт точно доходит до создания файла 1111111111111111111.txt
В чём может быть проблема?

AddEventHandler("main", "OnEpilog", "handler404");
function handler404()
{
  
    global $USER;
    global $APPLICATION;
  
    $curDir = $APPLICATION->GetCurDir();
    $arDir = explode('/', $curDir);
    $curPage = $APPLICATION->GetCurPage();
    
    if (isset($_SERVER["REAL_FILE_PATH"]))
    {
        $arRequest = explode("/", $_SERVER["REDIRECT_URL"]);
        if  (
                (
                    ($_SERVER["REAL_FILE_PATH"] == "/index.php") 
                    && (count($arRequest) != 3)
                ) 
                || 
                (
                    (count($arRequest) == 3) 
                    && (strlen($arRequest[2]) > 0) 
                    && (substr($arRequest[2], -5, 5) != ".html")
                )
            )
        {
            define("ERROR_404", "Y");
        }
    }


    $poddomen=str_replace(".vsesvetodiody.ru","",$_SERVER["HTTP_HOST"]);
    $poddomen=str_replace("vsesvetodiody.ru","",$poddomen);
   
  
    if(defined('ERROR_404') && ERROR_404 == 'Y')
    {
    
        $template = 'main';
        $APPLICATION->RestartBuffer();
        $APPLICATION->SetPageProperty("title", "Ошибка 404");
        $APPLICATION->SetPageProperty("h1", "Error 404");
        $APPLICATION->SetTitle("Error 404");
        include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
        include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
        include $_SERVER['DOCUMENT_ROOT'].'/include/404_text.php';
        include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';
    
    } else if ($poddomen) {

        CModule::IncludeModule('iblock');
        $select = Array("NAME","ID","CODE");
        $arFilter = Array("IBLOCK_ID"=>2, "CODE" => $poddomen, "ACTIVE" => "Y");
        $res = CIBlockElement::GetList(Array("SORT"=>"ASC", "PROPERTY_PRIORITY"=>"ASC"), $arFilter, $select);
        $poddomen = $res->GetNext();  

        if(!$poddomen["ID"])  {

          file_put_contents('1111111111111111111.txt', 1); 

          $template = 'main';
          $APPLICATION->RestartBuffer();
          $APPLICATION->SetPageProperty("title", "Ошибка 404");
          $APPLICATION->SetPageProperty("h1", "Error 404");
          $APPLICATION->SetTitle("Error 404");
          include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
          include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/header.php';
          include $_SERVER['DOCUMENT_ROOT'].'/include/404_text.php';
          include $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.$template.'/footer.php';

        }

    }
  
}

Введение

Страница 404-й ошибки должна загружаться в том случае, если
человек попытался открыть несуществующую страницу. Увидев сообщение «Страница
не найдена» пользователь поймет, что ошибся при вводе адреса, либо перешел по
нерабочей ссылке.

Но по нерабочей ссылке может перейти не только человек, но и
робот поисковой системы. Поэтому, кроме текстового сообщения об ошибке, страница
должна отдавать HTTP-код
404 – так поисковики понимают, что они попытались попасть на несуществующую
страницу. Разберемся, как создать страницу 404-й ошибки на сайте, который
работает  на системе управления
1С-Битрикс.

Создаем страницу /404.php

Для начала создаем в корне сайта файл 404.php со следующим кодом:

<?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->SetPageProperty("not_show_nav_chain", "Y");
$APPLICATION->SetTitle("Ошибка 404");
?>
<p>Страница не найдена. Она либо была удалена, либо вообще никогда не существовала. Возможно Вы ошиблись при вводе адреса, воспользуйтесь главным меню.</p>
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Если в корне сайта этот файл уже существует, проверяем, чтобы в самом начале были эти три строчки, они важны, если их нет – добавляем:

<?php include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");?>

Если интересно разобраться — отдельно рассмотрим каждую строчку нашего файла:

include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');

— подключаем систему обработки адресов Битрикса, чтобы корректно обрабатывать адреса динамических разделов (статей, новостей, каталогов).

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

— устанавливаем HTTP-статус  404, благодаря этим строчкам поисковики поймут, что запрашиваемой страницы не существует.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

— подключаем шапку сайта.

$APPLICATION->SetPageProperty("not_show_nav_chain", "Y");

— отключаем отображение цепочки навигации (хлебных крошек) на этой странице.

$APPLICATION->SetTitle("Ошибка 404");

— устанавливаем h1 и title страницы.

<p>Страница не найдена. Она либо была удалена, либо вообще никогда не существовала. Возможно Вы ошиблись при вводе адреса, воспользуйтесь главным меню.</p>

— контент страницы, его можете отредактировать на своё усмотрение.

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

— подключаем подвал сайта.

Окей, страничку создали, идем дальше.

Проверяем наличие директивы в .htaccess

Открываем файл .htaccess в корне сайта, проверяем, что там есть такая строчка:

ErrorDocument 404 /404.php

Эта строчка есть в .htaccess сайтов на Битриксе по-умолчанию, но всё-равно лучше проверить. Если ее нет – добавляем. Этим мы указываем, что созданный нами файл /404.php должен загружаться при попытке открыть несуществующую страницу.

Проверяем настройки главного модуля

В админке идем в настройки Главного модуля (Настройки => Настройки продукта => Настройки модулей => Главный модуль) и проверяем, чтобы опция Посылать в заголовке статус 200 на 404 ошибку была отключена:

Опция Посылать в заголовке статус 200 на 404 ошибку

По названию опции понятно: если галочка стоит – страница с 404-й ошибкой будет возвращать статус 200, а это нам ни к чему. Поэтому если галочка стоит – убираем её.

Настраиваем компоненты

В настройках всех компонентов, которые отвечают за страницы
детального просмотра, нужно настроить режим обработки 404-й ошибки. Например,
это могут быть компоненты «Новости», «Каталог», «Новость детально», «Элемент
каталога детально» — одним словом все компоненты, которые генерируют страницы
детального просмотра.

Тут без конкретного примера не обойтись, поэтому рассмотрим следующую
ситуацию: на сайте есть раздел «Новости», страница детального просмотра
новостей генерируется компонентом «Новость детально». Урлы новостей выглядят
следующим образом /news/simvolnyj-kod-novosti/

Если мы перейдем в настройки данного компонента — в самом
низу увидим блок Настройки 404 ошибки.
По-умолчанию он выглядит вот так:

Настройки компонента по-умолчанию

Т.е. обработка 404-й ошибки не настроена. Если мы попытаемся открыть страницу с несуществующей новостью, например /news/asdfgffj4/ — получим вот такое стандартное сообщение:

Страница с ошибкой, но не 404

Сама страничка отдает HTTP-код 200. Так быть не должно, срочно исправляем! В настройках компонента отмечаем галочки Устанавливать статус 404 и Показ специальной страницы, поле Страница для показа не заполняем, т.к. по умолчанию это страница /404.php – т.е. то, что нам нужно. Блок настроек компонента теперь выглядит следующим образом:

Вносим изменения в настройки компонента

Теперь при попытке открыть несуществующую новость получаем нашу страницу 404:

Нормальная страница 404-й ошибки

Проверяем результат работы

Мы всё настроили, остается проверить, отдает ли наш сайт код
404 для несуществующих страниц. Для таких целей можно использовать сервис
яндекса https://webmaster.yandex.ru/tools/server-response/

Указываем ему любую несуществующую страницу нашего сайта и
получаем ответ:

Проверяем результат работы

Если Код статуса HTTP равен 404 Not Found — поздравляю, вы всё сделали правильно.

Теперь вы знаете, как настроить страницу-обработчик 404-й ошибки в Битриксе :)

\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Iblock\Component\Tools::process404('', true, true, true, false);

Часто нужно по той или иной причине вывести страницу 404, чтобы не писать код самостоятельно в модуле iblock есть готовый метод для генерации 404 ошибки — process404(). Пример выше показывает как пользоватся этим методом.

Метод объявлен с такими параметрами:

\Bitrix\Iblock\Component\Tools::process404($message = "", $defineConstant = true, $setStatus = true, $showPage = false, $pageFile = "");
Параметр Описание
$message Сообщение, которое будет отображено компонентом bitrix:system.show_message.
$defineConstant нужно ли установить значение констаты ERROR_404 'Y'
$setStatus нужно ли передавать в заголовке статус 404 Not Found
$showPage Если true, то рабочая область будет очищена и будет показано содержимое файла /404.php . Так же если данный параметр принимает значение true, то выполнение текущего скрипта завершается (вызывается функция die()).
$pageFile путь к кастомному файлу 404.php

Описание метода и его параметров в документации.

Важно подключать модуль iblock, иначе вместо 404 страницы получите ошибку о том что класс \Bitrix\Iblock\Component\Tools не найден.

Рубрики:
PHP
Bitrix

Если есть вопросы, что-то в статье не понятно или нашли ошибку, напишите об этом в комментариях, все комментарии читаются и по возможности материал будет доработан.

Популярные статьи

Bitrix подключить модуль

Так как bitrix состоит из большого количества различных модулей, знать как их правильно подключать просто необходимо.

Bitrix подключить класс компонента

В статье приводится пример того как можно подключить только компонент битрикс без подключения его шаблона, чтобы можно было вызвать его метод или получить значения свойств

Команда grep. Примеры использования

grep — удобная и быстрая команда, здесь приведены примеры как произвести рекурсивный поиск в каталоге, поиск среди запущенных процессов и другие.

Комментарии

Комментариев пока нет

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Вызов httpsendrequest вернул ошибку 12002
  • Вызванный врачебной ошибкой на латыни
  • Вызванный врачебной ошибкой термин на латинском
  • Выезжая на дорогу будьте внимательны ошибка
  • Выделить причины дисграфических ошибок

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: