RSS – формат, к которому подходим с инженерной дотошностью. По статистике, 70% самодельных RSS-лент в Битрикс не проходят валидатор W3C из-за банальных ошибок: неправильный MIME-тип, отсутствие CDATA-обёртки, даты в нестандартном формате. Наша команда за 7 лет настроила более 50 лент — каждая проходит валидацию и корректно читается всеми агрегаторами. Типичная экономия времени на отладку — от 4 до 8 часов на проект, что при ставке разработчика даёт заметную экономию бюджета.
Битрикс генерирует RSS через компонент bitrix:rss.out, но по умолчанию лента выходит с рядом проблем: неправильные кодировки, отсутствие CDATA-обёрток для HTML-контента, некорректные даты, нет поддержки Atom. В этой заметке разберём, как довести стандартный компонент до ума — от MIME-типа до кеширования. Интересует готовая настройка? Обращайтесь за консультацией — оценим ваш проект.
Как исправить 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");
$APPLICATION->IncludeComponent("bitrix:rss.out", "", [...]);
Это избавляет от главной причины невалидности — MIME-типа. Дополнительно добавляем X-Robots-Tag: noindex, чтобы RSS не индексировался как HTML.
Почему CDATA обязателен?
Стандартный шаблон компонента не оборачивает DETAIL_TEXT в CDATA. Агрегаторы не могут разобрать HTML внутри XML — это приводит к ошибке парсинга. В результате лента не проходит валидацию, и агрегаторы показывают пустое описание. Решение — скопировать шаблон и внести правки.
Копирование шаблона для кастомизации выполните командой cp -r /bitrix/components/bitrix/rss.out/templates/.default/ /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">
"}
Wait, the input is just a single line with an opening tag. It's already properly formatted. But the instruction says to restore proper newlines. Since it's XML, typically the root element is on its own line. The flattened code is just that one line. Adding a newline at the end is fine. But maybe there is more? The user gave only that. So output with a newline at the end. But careful: the JSON string must have real newline. So I'll put
. Also ensure no extra spaces. The original has a trailing space before the >? Actually it has "> " with a space after? Let's see: "<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"> " - there is a space after the >. That might be part of the flattened line. But we should not remove it. So we add a newline after that space? Or before? Typically we put the newline after the >, but the space is there. To preserve exactly, we add a newline after the space. So the code becomes: "<rss ...>
" but with the space before newline. So I'll output that.
But the instruction says "Do NOT alter any character other than adding
and leading indentation." So we add a newline at the end. So the code string is exactly the original plus a newline. So I'll do that.
Thus JSON: {"code": "<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
"}
But careful: in JSON, we need to escape double quotes. So I'll write it properly.
I'll output that.<ï½endâofâthinkingï½>{"code": "<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
Что такое namespace и зачем они нужны?
Namespace (пространства имён) позволяют расширять стандарт RSS 2.0 дополнительными элементами. Без правильного объявления xmlns:media элемент media:content будет проигнорирован. Аналогично с content:encoded. В ленте обязательно должны быть объявлены namespace, которые вы используете. Перечень основных:
| namespace | URI | Назначение |
|---|---|---|
| content | http://purl.org/rss/1.0/modules/content/ | HTML-контент в CDATA |
| media | http://search.yahoo.com/mrss/ | Изображения и медиа |
| atom | http://www.w3.org/2005/Atom | Ссылка на Atom-ленту (self) |
Как добавить изображения в RSS?
Для агрегаторов, показывающих превью изображений — добавить media:content:
<?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 — сильный сигнал для агрегаторов, но без правильного namespace элемент будет проигнорирован.
Как настроить кеширование и снизить нагрузку на БД?
Каждое обращение к RSS без кеша запускает GetList по инфоблоку. Кеш компонента через управляемый кеш:
"CACHE_TYPE" => "A", // автоматический кеш
"CACHE_TIME" => "3600", // 1 час
Дополнительно в Nginx — кеширование на уровне прокси: proxy_cache_valid 200 15m;. Сравнение: без кеша RSS-лента генерируется за 200-300 мс, с кешем — менее 10 мс, то есть кеширование улучшает время ответа в 20–30 раз. Нагрузка на БД снижается в 20 раз. Для высоконагруженных проектов это критично — кеш позволяет отдавать до 1000 запросов в секунду на одном сервере.
Валидация ленты и типичные ошибки
Проверить RSS на валидность можно онлайн через W3C RSS Validator (validator.w3.org/feed/) или через curl + xmllint. Типичные ошибки: незакрытые теги в DETAIL_TEXT, запрещённые символы (управляющие символы ASCII 0x00–0x1F, кроме tab/LF/CR), отсутствие <lastBuildDate> в заголовке канала.
| Ошибка | Причина | Решение |
|---|---|---|
| MIME-тип text/html | Отсутствует header() | Установить Content-Type: application/rss+xml |
| HTML без CDATA | Стандартный шаблон | Оборачивать DETAIL_TEXT в CDATA |
| Даты в формате d.m.Y | Не конвертируется | Использовать date(DATE_RSS, $timestamp) |
| Нет lastBuildDate | Пропущен в шаблоне | Добавить <lastBuildDate> в <channel> |
| Отсутствуют изображения | Не добавлен media:content | Вставить элемент с правильным namespace |
Что входит в настройку RSS-ленты у нас
Мы настраиваем RSS-ленты под ключ: анализируем текущую ленту, дорабатываем шаблон компонента, настраиваем MIME-типы и заголовки, добавляем CDATA и media:content, проводим валидацию через W3C, настраиваем кеширование и передаём документацию по поддержке ленты. Опыт — более 50 проектов с Битрикс за 7 лет работы. Гарантируем, что лента проходит валидатор и корректно читается всеми популярными агрегаторами.
Получите консультацию по настройке RSS — свяжитесь с нами, оценим ваш проект и предложим дорожную карту. Наша команда готова настроить ленту под ваш проект — обращайтесь за консультацией.







