Настройка RSS-ленты 1С-Битрикс
RSS остаётся актуальным форматом для агрегаторов новостей, мониторинговых сервисов и синдикации контента. Битрикс генерирует RSS через компонент bitrix:rss.out, но по умолчанию лента выходит с рядом проблем: неправильные кодировки, отсутствие CDATA-обёрток для HTML-контента, некорректные даты, нет поддержки Atom.
Встроенный компонент RSS
Компонент bitrix:rss.out доступен в «Контент» → «RSS-лента» в визуальном редакторе страниц. Страница RSS обычно располагается по пути /rss.php или /news/rss/.
Минимальный код страницы RSS:
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetPageProperty("robots", "noindex");
$APPLICATION->IncludeComponent(
"bitrix:rss.out",
"",
[
"IBLOCK_TYPE" => "news",
"IBLOCK_ID" => "3",
"SECTION_ID" => "",
"SECTION_CODE" => "",
"FIELD_IMAGE" => "Y",
"ELEMENT_COUNT" => "20",
"SORT_FIELD" => "ACTIVE_FROM",
"SORT_ORDER" => "DESC",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "360",
"SET_TITLE" => "N",
"CHARSET" => "utf-8"
]
);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php");
Проблема с MIME-типом и заголовками
По умолчанию страница RSS отдаётся с Content-Type: text/html. RSS-агрегаторы ожидают application/rss+xml. Решение — установить заголовок в начале страницы, ДО вызова header.php:
<?php
define("NO_KEEP_STATISTIC", true);
define("NO_AGENT_CHECK", true);
header("Content-Type: application/rss+xml; charset=utf-8");
header("X-Robots-Tag: noindex");
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
// Компонент без header.php и footer.php
$APPLICATION->IncludeComponent("bitrix:rss.out", "", [...]);
Настройка шаблона RSS для HTML-контента
Стандартный шаблон компонента не оборачивает DETAIL_TEXT в CDATA. Агрегаторы не могут разобрать HTML внутри XML. Копировать шаблон для кастомизации:
cp -r /var/www/bitrix/bitrix/components/bitrix/rss.out/templates/.default/ \
/var/www/bitrix/local/components/bitrix/rss.out/templates/.default/
В файле template.php шаблона найти вывод описания и обернуть в CDATA:
// Было:
<?= $arItem["DETAIL_TEXT"] ?>
// Стало:
<![CDATA[<?= strip_tags($arItem["DETAIL_TEXT"]) ?>]]>
// Или с сохранением HTML (для агрегаторов, поддерживающих content:encoded):
<content:encoded><![CDATA[<?= $arItem["DETAIL_TEXT"] ?>]]></content:encoded>
В элемент <channel> добавить namespace для content:
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:atom="http://www.w3.org/2005/Atom">
Корректный формат дат
RSS требует дату в формате RFC 2822: Mon, 15 Mar 2024 12:00:00 +0300. Битрикс отдаёт дату в формате d.m.Y H:i:s. В шаблоне компонента:
// Конвертация даты Битрикс в RFC 2822
$bitrixDate = $arItem["ACTIVE_FROM"]; // "15.03.2024 12:00:00"
$timestamp = MakeTimeStamp($bitrixDate, "DD.MM.YYYY HH:MI:SS");
$rfc2822Date = date(DATE_RSS, $timestamp);
RSS с изображениями (media:content)
Для агрегаторов, показывающих превью изображений — добавить media:content:
<!-- namespace в <rss>: xmlns:media="http://search.yahoo.com/mrss/" -->
<?php if ($arItem["PREVIEW_PICTURE"]): ?>
<?php $pic = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); ?>
<media:content url="<?= SITE_SERVER_NAME . $pic["SRC"] ?>"
medium="image"
type="<?= $pic["CONTENT_TYPE"] ?>" />
<?php endif; ?>
Кеширование RSS
Каждое обращение к RSS без кеша запускает GetList по инфоблоку. Кеш компонента через управляемый кеш:
"CACHE_TYPE" => "A", // автоматический кеш
"CACHE_TIME" => "3600", // 1 час
Дополнительно в Nginx — кеширование на уровне прокси:
location ~* /rss(\.php)?$ {
proxy_cache_valid 200 15m;
add_header X-Cache-Status $upstream_cache_status;
}
Валидация ленты
Проверить RSS на валидность:
# Через curl + xmllint
curl -s https://example.ru/rss/ | xmllint --noout -
# Или онлайн: https://validator.w3.org/feed/
Типичные ошибки: незакрытые теги в DETAIL_TEXT, запрещённые символы (управляющие символы ASCII 0x00–0x1F, кроме tab/LF/CR), отсутствие <lastBuildDate> в заголовке канала.







