Descoberta automática de feed RSS pode não encontrar feeds específicos de tópicos

Olá! Na NLnet Labs, estamos configurando o Discourse para nossos produtos (community.nlnetlabs.nl). Um usuário perguntou sobre como obter o feed RSS para um tópico específico (ex: https://community.nlnetlabs.nl/c/cascade/10), pois o leitor de RSS dele não o encontrou.

Tentei usar essa página específica do tópico com meu leitor de feed RSS de preferência, e ele encontrou dois feeds: “NLnet Labs Community - Latest Posts” (/posts.rss) e “NLnet Labs Community - Latest topics” (/latest.rss). Eu sei que /c/cascade/10.rss é um feed RSS válido, mas meu leitor não o encontrou automaticamente. Isso é um pouco frustrante, pois precisaremos começar a comunicar esses URLs nós mesmos.

Eu investiguei a descoberta automática de feed RSS para meu site pessoal, então tenho alguma experiência com isso. Verifiquei o <head> da página da web; notei os seguintes links:

<link rel="alternate" type="application/rss+xml" title="Latest posts" href="https://community.nlnetlabs.nl/posts.rss">
<link rel="alternate" type="application/rss+xml" title="Latest topics" href="https://community.nlnetlabs.nl/latest.rss">
<link rel="alternate nofollow" type="application/rss+xml" title="RSS feed of topics in the 'Cascade' category" href="https://community.nlnetlabs.nl/c/cascade/10.rss">

Portanto, o <head> inclui um terceiro link para o feed RSS específico do tópico; mas parece que alguns leitores de feed RSS não gostam do atributo rel=”nofollow”.

É claro que verifiquei o MDN (HTML attribute: rel - HTML | MDN); nofollow é documentado como:

Indica que o autor ou editor original do documento atual não endossa o documento referenciado.

Mas também:

Relevante para <form>, <a> e <area>, a palavra-chave nofollow informa aos spiders de mecanismos de busca para ignorar o relacionamento do link. O relacionamento nofollow pode indicar que o proprietário do documento atual não endossa o documento referenciado. É frequentemente incluído por Otimizadores de Mecanismos de Busca que fingem que suas link farms não são páginas de spam.

Procurei no código-fonte do Discourse no GitHub, e com algumas buscas e git blame consegui encontrar FEATURE: add nofollow to RSS alternate link in topics and categories by rr-it · Pull Request #16013 · discourse/discourse · GitHub. Então, suponho que o segundo significado para rel=”nofollow” foi o pretendido aqui. Seguindo a discussão de fundo, parece ser útil para guiar a priorização em crawlers de sites. Houve um acompanhamento adicional em Search engines now blocked from indexing non-canonical pages - #4 by rrit, mas não consegui descobrir se rel=\"nofollow” ainda é importante.

Não consegui encontrar nenhuma discussão no Discourse Meta sobre este problema, embora o PR tenha sido mesclado em 2022. Claramente, há um mal-entendido nas convenções em torno dos <link>s para feeds RSS, entre alguns leitores de feed RSS e o Discourse. Então, pergunto:

  1. O rel=”nofollow” ainda serve à sua intenção original de melhorar a priorização de crawlers de sites, ou foi substituído por outras técnicas?
  2. Esse comportamento (ou seja, ignorar links rel=”nofollow”) na autodescoberta de leitores de feed RSS parece ser comum? Outros conseguem replicá-lo? Não estou ciente de um padrão autoritário sobre autodescoberta de feed RSS.
  3. Há disposição para suportar este caso de uso, para que os leitores de feed RSS descubram automaticamente as postagens corretas? A existência desses <link>s específicos de tópico, mesmo que não estejam sendo usados pelo meu leitor, me faz pensar que sim; talvez a perda de funcionalidade tenha sido simplesmente esquecida quando rel=”nofollow” foi adicionado?

Para os desenvolvedores do Discourse: obrigado por construírem isso!

1 curtida

Olá Arya,

Sim — este é de fato um resultado de como o Discourse lida atualmente com feeds RSS específicos de tópicos, não um bug no seu leitor de feed. A causa raiz é que o Discourse adiciona rel="nofollow" ao elemento <link> para feeds RSS de tópicos/categorias. Muitos leitores de feed ignoram links com nofollow, o que impede a descoberta automática, embora o feed em si seja válido e funcione se acessado diretamente.

Uma solução prática é usar um Componente de Tema para adicionar links RSS específicos de tópicos sem nofollow. Aqui está um exemplo simples:

<!-- Adiciona links RSS específicos de tópicos sem 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>

Isso verifica todos os links RSS de tópicos/categorias e injeta novos elementos <link> sem nofollow no <head>.

Os leitores de feed agora devem detectar feeds específicos de tópicos automaticamente.

Alternativamente, para uma abordagem mais simples, você pode simplesmente compartilhar o URL do feed diretamente com os usuários, por exemplo, Cascade - NLnet Labs Community.

Este método evita modificar o núcleo do Discourse e funciona em todas as atualizações. Espero que isso ajude a autodescoberta de feeds a funcionar como esperado!

Saudações!

1 curtida

Posso perguntar qual é esse leitor de feed RSS?

Olá Ayke! Estou usando o GitHub - spacecowboy/Feeder: Android feed reader app (disponível no F-Droid e na Play Store). Não sei quais leitores de feed nossos usuários tentaram.

Edição: Dei uma olhada no código-fonte: \u003chttps://github.com/spacecowboy/Feeder/blob/bd98548f7a900b92c2fab9e7d5046827e12e2dbf/app/src/main/java/com/nononsenseapps/feeder/model/FeedParser.kt#L122\u003e parece procurar por correspondências exatas de rel=”alternate”, que é o motivo pelo qual está faltando rel=”alternate nofollow”. Eu chamaria isso de um bug do lado deles, a menos que outros leitores de feed sejam mais cuidadosos.

Acontece que existe um padrão para a autodescoberta de feeds RSS: \u003chttps://www.rssboard.org/rss-autodiscovery#element-link-rel\u003e. Ele proíbe explicitamente qualquer coisa no atributo rel, exceto alternate. Portanto, o HTML gerado pelo Discourse está quebrando o padrão. Isso não significa que deva mudar definitivamente, mas é importante notar. Talvez adicionar rel=”nofollow” tenha funcionado em aqueles rastreadores de sites porque eles estavam em conformidade com o padrão de autodescoberta, indistinguivelmente dos leitores de feed RSS dos usuários, e a mudança quebrou ambos.

1 curtida

Bom achado!

Então meu relatório de bug pode ser nulo e sem efeito:

A próxima maneira correta de usar rel="nofollow" é o uso do cabeçalho HTTP Link: <...> ; rel="canonical" em todos os URLs de feed RSS.
Isso resultaria em todos os URLs de RSS serem rastreados uma vez pelo Google e, em seguida, serem descartados.

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

Por exemplo, para chamadas ao URL
https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890.rss
adicione este cabeçalho HTTP:
Link: <https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890>; rel="canonical"

Veja também a implementação da mesma ideia para o Joomla: Canonical HTTP Headers for RSS Feeds

Para ser claro: você acha que existe um comportamento alternativo adequado para o qual o Discourse possa mudar, que permitiria que ele estivesse em conformidade com a especificação? Isso seria ótimo. Os usuários de RSS ficarão felizes :slight_smile:

Editar: além disso, obrigado por abrir um relatório de bug no Feeder e mencionar a atualização da especificação. É bom ter uma discussão clara e engajada onde até mesmo problemas menores como este podem ser levados a sério.

1 curtida