|
Здравствуйте. На странице сайта выделяется часть УРЛ как символьный код элемента инфоблока. Сам инфоблок ищется вручную при помощи функции GetIBlockElementList(). Если эта функция возвращает false, то надо вернуть 404 ошибку. Как ее вызвать ? Подскажите, пожалуйста. |
|
|
Пользователь 14571 Эксперт Сообщений: 787 |
#2 0 03.04.2010 22:33:22
или есть битрикс-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»); Техдиректор — оперативная служба технической поддержки сайтов на Битриксе |
|
|
Виталий Спасибо. Но хочется сделать так, чтобы не только посылался заголовок ответа (404 Not Found), но показывалась вместо текущей страницы страница предназначенная для 404 ошибки. Просто сейчас загружается страница с пустой контентной областью, а необходимо показать страницу предназначенную для 404 ошибки. Т.е. отменить вывод текущей страницы и вместо нее выдать страницу с описанием ошибки. |
|
|
Редиректните тогда просто на страницу 404.php . Зачем вам тогда 404-я ошибка? |
|
|
Пользователь 60679 Заглянувший Сообщений: 7 |
#6 1 04.04.2010 11:29:17 Пока решил задачу таким образом:
Оформил ввиде отдельной функции, которую залил в /bitrix/php_interface/ID_сайта/init.php |
||
|
нормальное решение. |
|
|
А вот интересно, можно ли как-то узнать, вызывалась ли команда CHTTP::SetStatus(«404 Not Found»); на странице ранее? |
|
|
Пользователь 482727 Заглянувший Сообщений: 7 |
#9 0 01.06.2016 16:03:56
Походу за 6 лет чет изменилось? Не работает. |
||
|
Пользователь 27542 Эксперт Сообщений: 583 Какое еще пояснение? |
#10 7 01.06.2016 16:35:12 Если нужно вызвать полностью 404 страницу с очисткой всего выведенного уже в рабочей области (а не только HTTP статус установить), то можно так:
компоненты, модули · адаптивный форум · свойства-таблицы |
||
Очень часто сео-специалисты ставят задачу как можно сильнее упростить адрес до карточки товара и до карточки раздела и как результат мы получаем шаблон адреса вида: /раздел/ и /товар/. В таком случае типовой компонент 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 ошибку была отключена:
По названию опции понятно: если галочка стоит – страница с 404-й ошибкой будет возвращать статус 200, а это нам ни к чему. Поэтому если галочка стоит – убираем её.
Настраиваем компоненты
В настройках всех компонентов, которые отвечают за страницы
детального просмотра, нужно настроить режим обработки 404-й ошибки. Например,
это могут быть компоненты «Новости», «Каталог», «Новость детально», «Элемент
каталога детально» — одним словом все компоненты, которые генерируют страницы
детального просмотра.
Тут без конкретного примера не обойтись, поэтому рассмотрим следующую
ситуацию: на сайте есть раздел «Новости», страница детального просмотра
новостей генерируется компонентом «Новость детально». Урлы новостей выглядят
следующим образом /news/simvolnyj-kod-novosti/
Если мы перейдем в настройки данного компонента — в самом
низу увидим блок Настройки 404 ошибки.
По-умолчанию он выглядит вот так:
Т.е. обработка 404-й ошибки не настроена. Если мы попытаемся открыть страницу с несуществующей новостью, например /news/asdfgffj4/ — получим вот такое стандартное сообщение:
Сама страничка отдает HTTP-код 200. Так быть не должно, срочно исправляем! В настройках компонента отмечаем галочки Устанавливать статус 404 и Показ специальной страницы, поле Страница для показа не заполняем, т.к. по умолчанию это страница /404.php – т.е. то, что нам нужно. Блок настроек компонента теперь выглядит следующим образом:
Теперь при попытке открыть несуществующую новость получаем нашу страницу 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 — удобная и быстрая команда, здесь приведены примеры как произвести рекурсивный поиск в каталоге, поиск среди запущенных процессов и другие.
Комментарии
Комментариев пока нет






