La autodetección del lector RSS puede omitir feeds específicos de temas

Hola! En NLnet Labs, hemos estado configurando Discourse para nuestros productos (community.nlnetlabs.nl). Un usuario preguntó sobre cómo obtener el feed RSS para un tema en particular (ej. https://community.nlnetlabs.nl/c/cascade/10), ya que su lector de RSS no podía encontrarlo.

Probé a usar esa página específica del tema con mi lector de feeds RSS preferido, y encontró dos feeds: “NLnet Labs Community - Latest Posts” (/posts.rss) y “NLnet Labs Community - Latest topics” (/latest.rss). Sé que /c/cascade/10.rss es un feed RSS válido, pero mi lector no pudo encontrarlo automáticamente. Esto es un poco frustrante, ya que tendremos que empezar a comunicar estas URL nosotros mismos.

He investigado el descubrimiento automático de feeds RSS para mi sitio web personal, así que tengo algo de experiencia con esto. Revisé el <head> de la página web; noté los siguientes enlaces:

<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">

Así que el <head> incluye un tercer enlace para el feed RSS específico del tema; pero parece que a algunos lectores de feeds RSS no les gusta el atributo rel=”nofollow”.

Por supuesto, revisé MDN (HTML attribute: rel - HTML | MDN); nofollow está documentado como:

Indica que el autor o editor original del documento actual no respalda el documento referenciado.

Pero también:

Relevante para <form>, <a>, y <area>, la palabra clave nofollow indica a las arañas de los motores de búsqueda que ignoren la relación del enlace. La relación nofollow puede indicar que el propietario del documento actual no respalda el documento referenciado. A menudo es incluida por los Optimistas de Motores de Búsqueda que simulan que sus granjas de enlaces no son páginas de spam.

Revisé el código fuente de Discourse en GitHub, y con algunas búsquedas y Git blame pude encontrar FEATURE: add nofollow to RSS alternate link in topics and categories by rr-it · Pull Request #16013 · discourse/discourse · GitHub. Así que supongo que el segundo significado de rel=”nofollow” fue el que se pretendía aquí. Siguiendo la discusión de fondo, parece ser útil para guiar la priorización en los rastreadores del sitio. Hubo un seguimiento adicional en Search engines now blocked from indexing non-canonical pages - #4 by rrit, pero no pude averiguar si rel=\"nofollow” sigue siendo importante.

No pude encontrar ninguna discusión en Discourse Meta sobre este problema, a pesar de que el PR fue fusionado en 2022. Claramente, hay un malentendido en las convenciones en torno a los <link>s para los feeds RSS, entre algunos lectores de feeds RSS y Discourse. Así que pregunto:

  1. ¿rel=”nofollow” todavía cumple su intención original de mejorar la priorización de los rastreadores del sitio, o ha sido reemplazado por otras técnicas?
  2. ¿Este comportamiento (es decir, ignorar los enlaces rel=”nofollow”) en el autodescubrimiento de lectores de feeds RSS parece ser común? ¿Pueden otros replicarlo? No estoy al tanto de un estándar autoritario sobre el autodescubrimiento de feeds RSS.
  3. ¿Hay voluntad para soportar este caso de uso, para que los lectores de feeds RSS descubran automáticamente las publicaciones correctas? La existencia de esos <link>s específicos del tema, incluso si mi lector no los está utilizando, me hace pensar que sí; tal vez la pérdida de funcionalidad fue simplemente pasada por alto cuando se agregó rel=”nofollow”.

A los desarrolladores de Discourse: ¡gracias por construir esto!

1 me gusta

Hola Arya,

Sí, este es de hecho un resultado de cómo Discourse maneja actualmente las fuentes RSS específicas de los temas, no un error en tu lector de fuentes. La causa raíz es que Discourse añade rel="nofollow" al elemento <link> para las fuentes RSS de temas/categorías. Muchos lectores de fuentes ignoran los enlaces con nofollow, lo que impide el descubrimiento automático, aunque la fuente en sí es válida y funciona si se accede a ella directamente.

Una solución práctica es usar un Componente de Tema para añadir enlaces RSS específicos del tema sin nofollow. Aquí tienes un ejemplo sencillo:

<!-- Añadir enlaces RSS específicos del tema sin 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>

Esto escanea todos los enlaces RSS de temas/categorías e inyecta nuevos elementos <link> sin nofollow en el <head>.

Los lectores de fuentes ahora deberían detectar automáticamente las fuentes específicas de los temas.

Alternativamente, para un enfoque más sencillo, puedes simplemente compartir la URL de la fuente directamente con los usuarios, por ejemplo, Cascade - NLnet Labs Community.

Este método evita modificar el núcleo de Discourse y funciona a través de las actualizaciones. ¡Espero que esto ayude a que la autodescubrimiento de fuentes funcione como se espera!

¡Saludos!

1 me gusta

¿Puedo preguntar cuál es ese lector de feeds RSS?

¡Hola Ayke! Estoy usando GitHub - spacecowboy/Feeder: Android feed reader app (disponible en F-Droid y Play Store). No sé qué lectores de feeds han probado nuestros usuarios.

Edición: Eché un vistazo al código fuente: https://github.com/spacecowboy/Feeder/blob/bd98548f7a900b92c2fab9e7d5046827e12e2dbf/app/src/main/java/com/nononsenseapps/feeder/model/FeedParser.kt#L122 parece buscar coincidencias exactas de rel=”alternate”, razón por la cual le falta rel=”alternate nofollow”. Yo llamaría a esto un error de su parte si otros lectores de feeds son más cuidadosos.

Resulta que existe un estándar sobre el autodescubrimiento de fuentes RSS: \u003chttps://www.rssboard.org/rss-autodiscovery#element-link-rel\u003e. Prohíbe explícitamente cualquier cosa en el atributo rel excepto alternate. Así que el HTML generado por Discourse está rompiendo el estándar. Eso no significa que deba cambiar definitivamente, pero es importante tenerlo en cuenta. Quizás añadir rel=”nofollow” funcionó en esos rastreadores de sitios porque se ajustaban al estándar de autodescubrimiento, indistinguiblemente de los lectores de fuentes RSS de los usuarios, y el cambio rompió a ambos.

1 me gusta

¡Buen hallazgo!

Entonces mi informe de error podría ser nulo y sin efecto:

La siguiente forma correcta de usar rel=”nofollow” es el uso del encabezado HTTP Link: <...> ; rel="canonical" en todas las URL de los canales RSS.
Esto resultaría en que Google rastree todas las URL de RSS una vez y luego las descarte finalmente.

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

Por ejemplo, para las llamadas a la URL
https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890.rss
añada este encabezado HTTP:
Link: <https://meta.discourse.org/t/rss-feeder-auto-discovery-can-miss-topic-specific-feeds/392890>; rel="canonical"

Consulte también la implementación de la misma idea para Joomla: Canonical HTTP Headers for RSS Feeds

Para ser claros: ¿crees que hay un comportamiento alternativo adecuado al que Discourse pueda cambiar, que le permita ajustarse a la especificación? Eso sería genial. Los usuarios de RSS se regocijarán :slight_smile:

Edición: además, gracias por presentar un informe de error en Feeder y mencionar la actualización de la especificación. Es agradable tener una discusión clara y comprometida donde incluso los problemas menores como este puedan tomarse en serio.

1 me gusta