coru

Создание полезных сайтов

RSS-лента не обновляется? Проверьте адрес, XML, ID и ридер

Сначала выясните, попала ли новая запись в публичную ленту. Затем отделите ошибку самой ленты от задержки загрузки или отображения в ридере.

1. Загрузите ленту по точному адресу

Скопируйте URL ленты, сохранённый в ридере. Если подписка по адресу сайта не работает, найдите ссылку RSS и попробуйте точный адрес ленты. Начните с одной пропавшей записи: запишите её заголовок, время публикации и ожидаемую ссылку.

Работайте в новой папке: существующие файлы с этими именами будут перезаписаны. Чтобы сохранить публичную ленту через curl, замените адрес примера и выполните: curl -q -sS --compressed --max-time 20 -L --max-redirs 5 -D feed-headers.txt -o feed-body.xml 'https://example.org/feed.xml'

Команда пропускает файл настроек curl, следует не более чем пяти перенаправлениям и останавливается через 20 секунд. Она не использует cookie входа из браузера. Заголовки и тело сохраняются отдельно; --compressed распаковывает сжатое тело, но оставляет сохранённые заголовки ответа неизменными. Посмотрите окончательный HTTP-статус в feed-headers.txt и содержимое feed-body.xml. Успешное завершение curl или HTTP 200 ещё не означают, что получена лента: это может быть страница входа или главная страница сайта. Расширение .xml тоже ничего не доказывает.

В RSS 2.0 ищите элемент rss с version="2.0", внутри него — channel и записи item. Документация валидатора W3C рекомендует application/rss+xml для RSS и application/atom+xml для Atom. Проверяйте и заголовок Content-Type, и тело: правильная метка не исправляет неправильное содержимое.

2. Исправьте XML до проверки ридера

Проверьте публичный URL или сохранённую ленту в W3C Feed Validation Service. Начинайте с первой ошибки, учитывая указанные строку и столбец. Обычный XML-парсер проверяет синтаксическую корректность, а валидатор лент — также правила формата. Успешная проверка одним не заменяет проверку другим.

Наш сломанный пример — <title>A & B</title>. В обычном тексте XML-элемента нужно написать <title>A &amp; B</title>; после разбора заголовок по-прежнему будет A & B. В URL внутри XML-текста тоже экранируют разделитель параметров: https://example.org/?a=1&amp;b=2. Передавайте XML-сериализатору исходный текст без предварительного экранирования: он выполнит его один раз.

Проверьте и всё, что выводится перед XML-декларацией. Если она есть, её место — в начале документа; лишняя пустая строка или предупреждение сервера могут сломать XML. Исправьте генератор и заново загрузите публичный ответ.

3. Назначьте каждой записи постоянный ID

Элемент guid в RSS необязателен, но валидатор W3C рекомендует отдельное неизменное значение для каждой записи. Сохраняйте его при исправлении той же записи. Другой записи назначайте другое значение. Спецификация RSS разрешает ридерам определять новизну по этому ID; конкретный ридер может применять дополнительные правила.

Для идентификатора, который не является URL, явно задайте атрибут: <guid isPermaLink="false">post-42</guid>. Без него isPermaLink по умолчанию равен true: значение трактуется как постоянная ссылка, поэтому используйте настоящий полный URL.

Сравните пропавшую запись с более старой, а затем — две сборки одной записи. Одинаковый post-42 у двух записей и новый случайный ID для post-42 при каждой сборке — разные ошибки. Изменение заголовков, дат или всех старых ID ради принудительного обновления может скрыть причину и создать дубликаты.

4. Проверьте время и формат даты

Для RSS pubDate используйте формат RSS с английскими обозначениями дня и месяца и явным часовым поясом, например Wed, 21 Oct 2026 10:00:00 +0000. Руководство W3C рекомендует четырёхзначный год. Даты Atom используют RFC 3339, например 2026-10-21T10:00:00Z. Не переносите эту запись в RSS pubDate.

Atom — отдельный формат ленты: его элемент feed использует пространство имён http://www.w3.org/2005/Atom. Прежде чем разбирать поля, определите формат.

В нашей проверке 12:00:00 +0200 и 10:00:00 +0000 одной даты обозначают один момент. Если просто заменить пояс у 12:00 на +0000 без пересчёта, момент сдвинется на два часа вперёд. Сопоставьте сохранённое время с задуманным временем публикации. Ридеры могут откладывать показ RSS-записи с pubDate в будущем; спецификация не требует этого от каждого ридера.

5. Отделите публичный файл от опроса ридером

Если пропавшей записи нет в загруженной ленте, проверяйте генерацию, публикацию файла и кеши доставки. Обновление ридера не получит запись, которой нет в этом ответе. Сохраните предыдущий ответ, чтобы сравнивать настоящий список записей.

Если запись есть, корректна и имеет правильный ID, переходите к ридеру: сверьте адрес подписки, откройте список всех записей и посмотрите доступные сообщения об ошибке или время последней загрузки. Сервис может хранить собственную загруженную копию; обновление браузера не доказывает, что сервис заново запросил сайт.

Feedly описывает разные интервалы опроса в зависимости от тарифа, а для Basic — также от популярности сайта и частоты публикаций. Это сведения о конкретном сервисе, а не срок доставки для всех ридеров. Запишите ридер и время проверки, затем воспользуйтесь предусмотренным в нём обновлением или дождитесь заявленного цикла опроса, прежде чем менять корректные данные ленты.

6. Помогите обнаружить рабочую ленту

Если точный URL ленты работает, а подписка по главной странице — нет, проверьте head в HTML главной. Простой элемент для обнаружения RSS выглядит так: <link rel="alternate" type="application/rss+xml" href="https://example.org/feed.xml" title="Site updates">.

RSS Advisory Board описывает такую связь и рекомендует полный URL. Откройте сам href и проверьте, что он ведёт к нужной рабочей ленте. Добавьте также видимую ссылку RSS, чтобы читатель мог скопировать адрес.

На многоязычном сайте понятно подпишите каждую ленту и проверьте её записи. Ссылка «English», которая отдаёт другой язык, — ошибка обнаружения, даже если XML корректен. Ни этот элемент, ни видимая ссылка не гарантируют кнопку подписки в каждом браузере.

Шесть примеров: что изменили и что это доказало

Мы запустили эти небольшие оригинальные примеры локально 21 октября 2026 года. Это воспроизводимые проверки отдельных ошибок; они не проверяют живой аккаунт Feedly и не подтверждают спрос читателей.

  • Неправильный ответ: URL ленты возвращает HTTP 200 со страницей входа. Замена типа на application/rss+xml оставляет тело HTML-страницей. Проверяйте содержимое, а не только статус и заголовки.
  • Неэкранированный амперсанд: A & B вызывает ошибку нашего XML-парсера. Вариант A &amp; B успешно разбирается и возвращает исходный заголовок.
  • Повторный ID: два элемента item используют post-42. В нашей простой модели множества ID остаётся один уникальный ID; замена второго на post-43 даёт два. Это иллюстрация коллизии, а не обещание поведения конкретного ридера.
  • Меняющийся ID: исправление заголовка с прежним post-42 не добавляет нового уникального ID в этой модели. Замена на post-42-build-2 добавляет один. Исправление и новая запись требуют разного обращения.
  • Неправильный пересчёт пояса: 12:00 +0200 совпадает с 10:00 +0000. Простая замена +0200 на +0000 сдвигает момент на два часа.
  • Неправильная ссылка обнаружения: главная указывает на /old.xml с ответом 404, а /feed.xml отдаёт рабочую ленту. Исправление href восстанавливает этот путь без изменения самой ленты.

Сохраните короткую запись о проверке

Запишите точный URL ленты, время загрузки, окончательный HTTP-статус, тело ответа, результат валидатора, ID и дату пропавшей записи, название ридера. Исправьте тот участок, где есть подтверждённая ошибка, затем снова загрузите и проверьте ленту.

Завершите проверку в том же ридере и с той же подпиской. Корректная публичная лента — один результат; появление ожидаемой записи в этом ридере — другой. Наши локальные проверки охватывают содержимое ответа, синтаксис XML, простую модель ID, пересчёт времени и одну ссылку обнаружения. Они не устанавливают реальную частоту опроса сервисом, поведение кешей, число подписчиков или доставку во все ридеры.

Источники и материалы

Помогите улучшить руководство

← Все заметки