Гид по технологиям

Как создать RSS‑ленту для сайта

8 min read Web Обновлено 19 Nov 2025
Как создать RSS‑ленту для сайта
Как создать RSS‑ленту для сайта

Mac-RSS-Clients-Featured

RSS сохраняет читателей и интегрируется с внешними сервисами, ботами и автоматизациями. Ниже — подробное руководство от формата до деплоя и поддержки.

Что такое RSS в одном предложении

RSS — это спецификация XML, в которой список элементов (entries) описывает обновления сайта: заголовок, ссылка, описание, уникальный идентификатор и дата публикации.

Почему RSS всё ещё имеет значение

  • Подписка без трекеров: читатель получает обновления напрямую.
  • Автоматизация публикаций в соцсетях и агрегаторах.
  • Совместимость с множеством клиентов, почтовых сервисов и ботов.

Важно: RSS не заменяет современные API, но часто быстрее и проще для широкого распространения контента.


Формат RSS — шапка (HEADER)

RSS — это XML. Для того чтобы файл распознался как RSS, в нём должны быть корректные теги и структура.

Простейшая шапка выглядит так:



  
    Название RSS‑ленты
    https://www.example.com/
    Короткое описание сайта или ленты
    Wed, 04 Jul 2018 12:00:00 GMT

Пояснения к тегам:

  • title — заголовок канала.
  • link — URL сайта (обычно корень или страница ленты).
  • description — краткое описание.
  • lastBuildDate — необязательный, указывает, когда последний раз менялась лента.

Закрывать channel и rss надо в конце файла ( и ).

Формат RSS — элементы (CONTENT)

Каждая запись представлена парой тегов и должна содержать базовые поля:


  Заголовок записи
  https://www.example.com/post/123
  https://www.example.com/post/123
  Краткое описание или HTML‑фрагмент
  Wed, 04 Jul 2018 12:00:00 GMT

Ключевые замечания:

  • guid — уникальный идентификатор записи; может совпадать с URL или быть любым уникальным значением. Если guid постоянный, многие ридеры понимают, что запись не новая.
  • pubDate должен соответствовать формату времени, совместимому с RFC‑822 (часто используют GMT/UTC).
  • description обычно содержит HTML‑фрагмент с кратким содержимым; некоторые ридеры отображают его как основной текст.

Если вы хотите включать полнотекстовые статьи, убедитесь, что description корректно экранирован или обёрнут CDATA:

Полный HTML статьи с разметкой

]]>

Пример минимальной RSS‑ленты



  
    Пример сайта
    https://www.example.com/
    Новости и статьи
    Wed, 04 Jul 2018 12:00:00 GMT

    
      Первая запись
      https://www.example.com/post/1
      https://www.example.com/post/1
      
      Wed, 04 Jul 2018 12:00:00 GMT
    

  

feed-reader

Описание изображения: Интерфейс современного RSS‑ридера с заголовками и превью статей.

Сделать ленту динамической

Статический XML неудобен: при каждом обновлении нужно править файл вручную. Лучше генерировать ленту программно по данным из БД или CMS.

Общая логика генерации ленты:

  1. Подключиться к БД, где хранятся статьи.
  2. Выбрать N последних публикаций (обычно 10–20).
  3. Сформировать шапку RSS.
  4. Для каждой записи сгенерировать с title, link, guid, description, pubDate.
  5. Закрыть channel и rss, вернуть или сохранить файл.

Ниже — небольшие примеры генерации в популярных языках. Код — иллюстративный; адаптируйте под ваш стек и ORM.

PHP пример (используя PDO)

query("SELECT id, title, slug, excerpt, published_at FROM posts WHERE status='published' ORDER BY published_at DESC LIMIT 10");

echo "\n";
echo "\n\n";
echo "Мой сайт\nhttps://www.example.com/\n";

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $url = 'https://www.example.com/post/' . $row['slug'];
    $pubDate = gmdate('D, d M Y H:i:s ', strtotime($row['published_at'])) . 'GMT';
    echo "\n";
    echo "" . htmlspecialchars($row['title']) . "\n";
    echo "$url\n";
    echo "$url\n";
    echo "\n";
    echo "$pubDate\n";
    echo "\n";
}

echo "\n\n";

Пояснения к PHP‑примеру:

  • Заголовок Content‑Type помогает браузерам и ридерам распознать фид.
  • Для pubDate используется GMT через gmdate.
  • description оборачивается в CDATA, чтобы сохранить HTML.

Python пример (Flask)

from flask import Flask, Response
import sqlite3
from email.utils import formatdate

app = Flask(__name__)

def query_posts():
    con = sqlite3.connect('site.db')
    cur = con.cursor()
    cur.execute("SELECT id, title, slug, excerpt, published_at FROM posts WHERE status='published' ORDER BY published_at DESC LIMIT 10")
    return cur.fetchall()

@app.route('/feed')
def feed():
    items = query_posts()
    rss = ['', '', '', 'Мой сайт', 'https://www.example.com/']
    for id, title, slug, excerpt, published_at in items:
        url = f"https://www.example.com/post/{slug}"
        pubdate = formatdate(int(published_at.timestamp()))
        rss.append('')
        rss.append(f'{title}')
        rss.append(f'{url}')
        rss.append(f'{url}')
        rss.append(f'')
        rss.append(f'{pubdate}')
        rss.append('')
    rss.append('')
    rss.append('')
    return Response('\n'.join(rss), mimetype='application/xml')

Node.js пример (Express)

const express = require('express')
const app = express()
const db = require('./db') // ваша обёртка для БД

app.get('/feed', async (req, res) => {
  const rows = await db.query("SELECT id, title, slug, excerpt, published_at FROM posts WHERE status='published' ORDER BY published_at DESC LIMIT 10")
  res.set('Content-Type', 'application/rss+xml; charset=utf-8')
  let xml = '\n\n\n'
  xml += 'Мой сайтhttps://www.example.com/\n'
  rows.forEach(row => {
    const url = `https://www.example.com/post/${row.slug}`
    const pubDate = new Date(row.published_at).toUTCString()
    xml += `${escapeXml(row.title)}${url}${url}${pubDate}\n`
  })
  xml += ''
  res.send(xml)
})

function escapeXml(unsafe) {
  return unsafe.replace(/[<>&"']/g, c => ({'<':'<', '>':'>', '&':'&', '"':'"', "'":'''}[c]))
}

Советы по генерации:

  • Кешируйте результат на сервере и обновляйте только при публикации или каждые N минут, чтобы снизить нагрузку.
  • Убедитесь, что guid стабильный: меняющийся guid заставляет ридеры считать запись новой.
  • Для больших сайтов генерируйте фиды по категориям и по авторам.

Как сделать RSS обнаруживаемым (discoverable)

  1. Ссылка в HTML head: добавьте ссылку для автоматического обнаружения ридерами и браузерами:
  1. Правильный заголовок ответа: при динамической генерации отправляйте Content‑Type: application/rss+xml (или application/xml).

  2. Расположите файл на обычном URL: /feed, /rss.xml или /feeds/main.xml — пользователи и боты ожидают такие пути.

  3. В .htaccess можно заставить Apache обрабатывать .xml как PHP (при необходимости):

AddType application/x-httpd-php .xml

Эта техника полезна, если вы хотите хранить скрипт с расширением .xml, но сервер его не исполняет.

Альтернативы ручному созданию RSS

Если вы не хотите писать код, доступны внешние сервисы, которые преобразуют страницы в RSS:

  • FetchRSS — визуальный редактор элементов страницы для создания фида.
  • Feed43 — фильтры и шаблоны для извлечения фрагментов из HTML.
  • Feedity — визуальные инструменты для выделения элементов.
  • Feed Creator (FiveFilters) — генератор фидов по URL и правилам.

Эти сервисы полезны для сайтов без API, но обычно имеют ограничения по обновлению и тарифы за частые запросы.

fetchrss

Описание изображения: Пример интерфейса сервиса FetchRSS с подсветкой элементов на странице.

Уровни зрелости RSS в проекте

  • Уровень 0 — статический файл, редактируется вручную.
  • Уровень 1 — динамическая генерация при запросе, без кэша.
  • Уровень 2 — динамическая генерация с кэшем и корректными заголовками (ETag, Last‑Modified).
  • Уровень 3 — множество фидов по категориям, поддержка медиатегов (enclosure), лог запросов и мониторинг.

Рекомендуем начать с уровня 1–2 и постепенно переходить к уровням 3 при росте аудитории.

Расширения и фичи

  • Enclosure: для подкастов и медиафайлов добавляйте тег .
  • Media RSS: расширение для более богатых медиамета‑данных.
  • Atom: альтернативный стандарт, более строгий по спецификации; можно поддерживать и Atom‑ленту параллельно.

Критерии приёмки (acceptance)

  1. По URL /feed возвращается корректный XML с заголовком Content‑Type: application/rss+xml.
  2. Шапка содержит title, link, description и корректную дату lastBuildDate.
  3. Лента содержит N записей (N по ТЗ, обычно 10) с title, link, guid, description, pubDate.
  4. pubDate валиден и соответствует UTC; guid стабильный между генерациями.
  5. Кабельные тесты: валидатор W3C XML и RSS‑валидатор проходят без ошибок критичного уровня.
  6. Кэширование работает: ETag или Last‑Modified установлены и уменьшают нагрузку.

Ролевые чек‑листы

Разработчик:

  • Реализовал генерацию RSS и установил Content‑Type.
  • Использует CDATA или корректное экранирование HTML в description.
  • Обеспечил стабильность guid и корректность pubDate.

Системный администратор:

  • Настроил кэширование и заголовки (Cache‑Control, ETag).
  • Настроил URL (rewrite) и SSL для /feed.

Контент‑менеджер:

  • Проверил, что в описаниях нет приватных данных.
  • Отредактировал description так, чтобы превью были информативны.

Проверки и тесты

  • Валидировать RSS в онлайн‑валидаторе (например, W3C Feed Validation Service).
  • Подписаться на ленту в нескольких ридерах (Feedly, Inoreader, Thunderbird) и проверить отображение.
  • Смоделировать новую публикацию и убедиться, что ридер видит новый элемент (учитывая кэш).

Безопасность и приватность

  • Не включайте в description личные данные, токены или служебные урлы.
  • Если лента должна быть приватной, не публикуйте её публично — используйте аутентификацию (Basic, токены) или генерируемые закрытые фиды с уникальным секретом в URL.
  • Ограничьте скорость генерации сервера и используйте кэш, чтобы избежать DDoS‑эффектов при массовых подписках.

Производительность и кэширование

  • Для динамически генерируемой ленты держите в кеше готовый XML и обновляйте его при публикации новой статьи.
  • Устанавливайте Cache‑Control: public, max‑age=300 для фидов, часто обновляемых, или дольше для редко обновляемых.
  • Добавьте ETag/Last‑Modified, чтобы ридеры делали условные запросы.

Когда RSS не подходит

  • Если вам нужен сложный поиск и фильтрация по множеству параметров — лучше API.
  • Для интерактивных форм подписки с управлением подпиской лучше почтовые рассылки.

Миграция и совместимость

  • Большинство ридеров понимают RSS 2.0 и Atom. Поддерживать RSS 2.0 достаточно для базовой совместимости.
  • Если у вас уже есть Atom, создайте перенаправление с /feed на /feed.atom или поддерживайте оба формата.

Playbook деплоя RSS (шаги)

  1. Определите URL для фида (/feed или /rss.xml).
  2. Реализуйте генерацию: статический файл или динамический скрипт.
  3. Обеспечьте правильный Content‑Type и кодировку UTF‑8.
  4. Настройте кэширование и ETag/Last‑Modified.
  5. Добавьте ссылку rel=alternate в head сайта.
  6. Протестируйте в нескольких ридерах и валидаторе.
  7. Мониторьте ошибки и время ответа.

Отладка распространённых проблем

Проблема: ридер не показывает новые записи.

  • Проверьте guid: если он всегда меняется, ридер считает каждую запись новой или наоборот — если guid меняется, записи не распознаются.
  • Проверьте pubDate и часовой пояс.
  • Проверьте кэш: возможно, ридер кеширует старую версию.

Проблема: ошибки парсинга XML.

  • Убедитесь, что XML корректно экранирован.
  • Используйте CDATA для HTML в description.

Метаинформация и SEO для страницы фида

  • Заголовок страницы фида должен быть понятным: «Лента новостей — Мой сайт».
  • Добавьте rel=alternate в head, чтобы поисковые системы и ридеры автоматически обнаруживали ленту.
  • Не дублируйте весь контент на странице сайта; для полнотекстовых фидов укажите это в описании.

Примеры практических сценариев использования

  • Автопостинг в Twitter/Telegram через бота, который парсит RSS.
  • Импорт контента в агрегаторы и приложения новостей.
  • Подписка пользователей через внешние ридеры и почтовые сервисы.

Короткий чеклист для запуска (быстро)

  • URL /feed доступен по HTTPS.
  • Content‑Type: application/rss+xml.
  • В ленте есть title, link, description, lastBuildDate.
  • N последних записей присутствуют с guid и pubDate.
  • Лента валидируется в онлайн‑валидаторе.
  • Добавлена ссылка rel=alternate в head.

1‑строчный глоссарий

  • RSS: XML‑лента для обмена обновлениями.
  • feed reader: приложение для чтения RSS/Atom.
  • guid: уникальный идентификатор записи.
  • pubDate: дата публикации в формате RFC‑822.

Социальный превью и анонс

OG заголовок: Мой сайт — лента обновлений OG описание: Подписывайтесь на ленту, чтобы получать автоматические уведомления о новых статьях.

Короткий анонс (100–200 слов): Создали RSS‑ленту для сайта — теперь читатели получают обновления автоматически. RSS прост в реализации: достаточно сгенерировать корректный XML с элементами title, link, guid и pubDate. В статье есть примеры на PHP, Python и Node.js, советы по кэшированию, безопасности и обнаружению фида. Подходит для сайтов на CMS и самописных проектах.


Итог

RSS остаётся надёжным и простым способом уведомлять аудиторию и подключать внешние сервисы. Начните с простой ленты и добавляйте кэширование, медиатеги и отдельные фиды по мере роста сайта. Если хотите быстро — используйте сервисы типа FetchRSS или Feedity; если нужен контроль и масштаб — генерируйте ленты из своей базы данных.

Описание изображения: Иллюстрация клиентов RSS на разных устройствах, демонстрирующая кроссплатформенную совместимость лент.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

APC Index Mismatch — как исправить BSOD на Windows
Техподдержка

APC Index Mismatch — как исправить BSOD на Windows

Доступ к Android с разбитым экраном
Android.

Доступ к Android с разбитым экраном

Сброс Samsung при заблокированном телефоне
Мобильные устройства

Сброс Samsung при заблокированном телефоне

Как разогнать монитор через NVIDIA Control Panel
Гайды

Как разогнать монитор через NVIDIA Control Panel

APC_INDEX_MISMATCH: как исправить BSOD в Windows
Инструкции

APC_INDEX_MISMATCH: как исправить BSOD в Windows

Как исправить ошибку Blink 1011
Техническая поддержка

Как исправить ошибку Blink 1011