Налаштування RSS-стрічки 1С-Bitrix
RSS залишається актуальним форматом для агрегаторів новин, моніторингових сервісів та синдикації контенту. Bitrix генерує 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>
Додати namespace для content до елемента <channel>:
<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. Bitrix повертає дату в форматі d.m.Y H:i:s. У шаблоні компонента:
// Конвертація дати Bitrix у 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> у заголовку каналу.







