Автообнаружение RSS-фидеров может пропустить фиды, специфичные для темы

Привет! В NLnet Labs мы настраивали Discourse для наших продуктов (community.nlnetlabs.nl). Один из пользователей спросил, как получить RSS-ленту для конкретной темы (например, https://community.nlnetlabs.nl/c/cascade/10), поскольку его RSS-ридер не мог её найти.

Я попробовал открыть страницу конкретной темы в своём любимом RSS-ридере, и он нашёл две ленты: «NLnet Labs Community — Последние посты» (/posts.rss) и «NLnet Labs Community — Последние темы» (/latest.rss). Я знаю, что /c/cascade/10.rss — это корректная RSS-лента, но мой ридер не нашёл её автоматически. Это немного раздражает, так как нам теперь придётся самостоятельно сообщать эти URL-адреса.

Я занимался автоматическим обнаружением RSS-лент для своего личного сайта, поэтому имею некоторый опыт в этой области. Я проверил секцию <head> веб-страницы и заметил следующие ссылки:

<link rel="alternate" type="application/rss+xml" title="Последние посты" href="https://community.nlnetlabs.nl/posts.rss">
<link rel="alternate" type="application/rss+xml" title="Последние темы" href="https://community.nlnetlabs.nl/latest.rss">
<link rel="alternate nofollow" type="application/rss+xml" title="RSS-лента тем в категории 'Cascade'" href="https://community.nlnetlabs.nl/c/cascade/10.rss">

Таким образом, <head> действительно содержит третью ссылку на RSS-ленту для конкретной темы, но, похоже, некоторые RSS-ридеры не принимают атрибут rel="nofollow".

Конечно, я проверил MDN (HTML attribute: rel - HTML | MDN); nofollow описан следующим образом:

Указывает, что оригинальный автор или издатель текущего документа не поддерживает ссылочный документ.

А также:

Относится к <form>, <a> и <area>, ключевое слово nofollow сообщает поисковым роботам игнорировать связь по ссылке. Отношение nofollow может указывать на то, что владелец текущего документа не поддерживает ссылочный документ. Это часто добавляется специалистами по поисковой оптимизации (SEO), которые притворяются, что их фермы ссылок не являются спам-страницами.

Я изучил исходный код Discourse на GitHub и с помощью поиска и команды git blame смог найти FEATURE: add nofollow to RSS alternate link in topics and categories by rr-it · Pull Request #16013 · discourse/discourse · GitHub. Похоже, здесь имелось в виду второе значение rel="nofollow". Судя по обсуждению, это полезно для приоритизации при сканировании сайта. Было дополнительное обсуждение по ссылке Search engines now blocked from indexing non-canonical pages - #4 by rrit, но я не смог понять, остаётся ли rel="nofollow" важным.

Я не нашёл обсуждения этой проблемы на Discourse Meta, хотя PR был объединён ещё в 2022 году. Очевидно, существует недопонимание в соглашениях относительно тегов <link> для RSS-лент между некоторыми RSS-ридерами и Discourse. Поэтому я задаю вопросы:

  1. Сохраняет ли rel="nofollow" своё первоначальное назначение для улучшения приоритизации при сканировании сайта, или его заменили другие методы?
  2. Поведение (то есть игнорирование ссылок с rel="nofollow") при автоматическом обнаружении RSS-лент в ридерах кажется распространённым? Могут ли другие воспроизвести это? Мне неизвестен авторитетный стандарт автоматического обнаружения RSS-лент.
  3. Есть ли готовность поддержать этот случай использования, чтобы RSS-ридеры могли автоматически находить нужные посты? Существование этих ссылок <link> для конкретных тем, даже если мой ридер их не использует, заставляет меня так думать; возможно, потеря функциональности была просто упущена при добавлении rel="nofollow".

Команде разработчиков Discourse: спасибо за создание этого проекта!

1 лайк

Привет, Арья,

Да, это действительно связано с тем, как Discourse обрабатывает RSS-каналы для конкретных тем, а не с ошибкой в вашем RSS-ридере. Корень проблемы в том, что Discourse добавляет атрибут rel="nofollow" к элементу <link> для RSS-каналов тем/категорий. Многие RSS-ридеры игнорируют ссылки с nofollow, что предотвращает автоматическое обнаружение, хотя сам канал валиден и работает при прямом доступе.

Практическое решение — использовать компонент темы, чтобы добавить RSS-ссылки для конкретных тем без nofollow. Вот простой пример:

<!-- Добавить RSS-ссылки для конкретных тем без nofollow -->
<script type="text/discourse-plugin" version="0.8">
  api.onPageChange((url, title) => {
    document.querySelectorAll('link.custom-rss').forEach(e => e.remove());
    document.querySelectorAll('link[title^="RSS feed of"]').forEach(link => {
      const newLink = document.createElement('link');
      newLink.rel = "alternate";
      newLink.type = "application/rss+xml";
      newLink.href = link.href;
      newLink.title = link.title;
      newLink.classList.add('custom-rss');
      document.head.appendChild(newLink);
    });
  });
</script>

Этот скрипт находит все RSS-ссылки для тем/категорий и вставляет новые элементы <link> без nofollow в <head>.

Теперь RSS-ридеры должны автоматически обнаруживать каналы для конкретных тем.

Альтернативный, более простой подход — просто делиться URL канала напрямую с пользователями, например: Cascade - NLnet Labs Community.

Этот метод не требует изменения ядра Discourse и работает при обновлениях. Надеемся, это поможет автоматическому обнаружению каналов работать как ожидалось!

С уважением!

1 лайк

Могу я спросить, какой это RSS-агрегатор?

Привет, Айке! Я использую GitHub - spacecowboy/Feeder: Android feed reader app · GitHub (доступно в F-Droid и Play Store). Не знаю, какие именно приложения для чтения лент пробовали наши пользователи.

Редактирование: Я заглянул в исходный код: https://github.com/spacecowboy/Feeder/blob/bd98548f7a900b92c2fab9e7d5046827e12e2dbf/app/src/main/java/com/nononsenseapps/feeder/model/FeedParser.kt#L122 — там, похоже, ищутся точные совпадения rel="alternate", из-за чего пропускается rel="alternate nofollow". Я бы назвал это ошибкой с их стороны, если другие читалки RSS работают внимательнее.

Оказывается, существует стандарт для автоматического обнаружения RSS-каналов: https://www.rssboard.org/rss-autodiscovery#element-link-rel. Он явно запрещает любые значения в атрибуте rel, кроме alternate. Таким образом, сгенерированный HTML в Discourse нарушает этот стандарт. Это не обязательно означает, что нужно что-то менять, но важно это отметить. Возможно, добавление `rel=

1 лайк

Отличное замечание!

Тогда мой отчёт об ошибке, возможно, неактуален:

Правильный способ применения rel="nofollow" — использование HTTP-заголовка Link: <…>; rel="canonical" для всех URL RSS-лент.
Это приведет к тому, что Google будет сканировать все RSS-URL один раз, а затем в конечном итоге исключит их из индекса.

См. How to Specify a Canonical with rel="canonical" and Other Methods | Google Search Central  |  Documentation  |  Google for Developers

Например, для запросов к URL
https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890.rss
добавьте этот HTTP-заголовок:
Link: <https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890>; rel="canonical"

Также см. реализацию той же идеи для Joomla: Canonical HTTP Headers for RSS Feeds

Чтобы прояснить: вы считаете, что существует подходящее альтернативное поведение, на которое Discourse может переключиться, чтобы соответствовать спецификации? Это было бы здорово. Пользователи RSS будут в восторге :slight_smile:

Редакция: также спасибо за создание отчета об ошибке в Feeder и упоминание обновления спецификации. Приятно иметь чёткое, активное обсуждение, где даже такие незначительные вопросы, как этот, воспринимаются серьёзно.

1 лайк