RSSフィードの自動検出がトピック固有のフィードを見逃すことがある

こんにちは!NLnet Labsでは、製品(community.nlnetlabs.nl)のためにDiscourseを設定してきました。あるユーザーから、特定トピックのRSSフィード(例:https://community.nlnetlabs.nl/c/cascade/10)を取得したいが、RSSリーダーが見つけられない、という問い合わせがありました。

私がRSSフィードリーダーでそのトピック固有のページを使ってみたところ、2つのフィードが見つかりました。「NLnet Labs Community - Latest Posts」(/posts.rss)と「NLnet Labs Community - Latest topics」(/latest.rss)です。/c/cascade/10.rssが有効なRSSフィードであることは知っていますが、私のフィードリーダーは自動的にそれを見つけることができませんでした。これは少し厄介です。なぜなら、これらのURLをこちらから伝える必要が出てくるからです。

個人のウェブサイトのRSSフィードの自動検出について調査した経験があるので、これにはある程度の知識があります。ウェブページの<head>を確認したところ、以下のリンクに気づきました。

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

つまり、<head>にはトピック固有のRSSフィード用の3番目のリンクが含まれていますが、一部のRSSフィードリーダーはrel=”nofollow”属性を好まないようです。

もちろん、MDN(https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel)を確認しました。`nofollow`については次のように記載されています。

現在のドキュメントの元の作成者または発行者が、参照されているドキュメントを支持していないことを示します。

しかし、次のような記述もあります。

<form><a>、および<area>に関連して、nofollowキーワードは検索エンジンのスパイダーにリンク関係を無視するように伝えます。nofollow関係は、現在のドキュメントの所有者が参照されているドキュメントを支持していないことを示す場合があります。これは、リンクファームがスパムページではないと偽装する検索エンジン最適化(SEO)によって含まれることがよくあります。

GitHub上のDiscourseのソースコードを確認し、検索とGit blameを駆使して、FEATURE: add nofollow to RSS alternate link in topics and categories by rr-it · Pull Request #16013 · discourse/discourse · GitHub を見つけました。したがって、rel=”nofollow”の2番目の意味がここで意図されていたのだろうと思います。背景の議論をたどると、サイトクローラーの優先順位付けを誘導するのに役立つようです。Search engines now blocked from indexing non-canonical pages - #4 by rrit でさらなるフォローアップがありましたが、rel=\"nofollow”がまだ重要かどうかはわかりませんでした。

この問題についてDiscourse Metaで議論を見つけることができませんでした。PRが2022年にマージされたにもかかわらずです。明らかに、RSSフィードリーダーとDiscourseの間で、RSSフィードの<link>に関する慣習について誤解が生じています。そこで、次のことをお尋ねします。

  1. rel=”nofollow”は、サイトクローラーの優先順位付けを改善するという元の意図をまだ果たしていますか、それとも他の技術に取って代わられましたか?
  2. RSSフィードリーダーの自動検出におけるこの動作(つまり、rel=”nofollow”リンクの無視)は一般的でしょうか?他の人も再現できますか?RSSフィードの自動検出に関する権威ある標準については知りません。
  3. RSSフィードリーダーが適切な投稿を自動的に検出できるように、このユースケースをサポートする意向はありますか?トピック固有の<link>が存在するという事実は、私のフィードリーダーでは使用されていませんが、そうであることを示唆しています。おそらく、rel=”nofollow”が追加されたときに、機能の喪失が見過ごされたのでしょう。

Discourseの開発者の皆さん:これを作成してくれてありがとうございます!

「いいね!」 1

こんにちは、Aryaさん

はい、これはフィードリーダーのバグではなく、Discourseがトピック固有のRSSフィードを処理する方法によるものです。根本的な原因は、Discourseがトピック/カテゴリのRSSフィードの<link>要素にrel="nofollow"を追加することです。多くのフィードリーダーはnofollow付きのリンクを無視するため、フィード自体は有効で直接アクセスすれば機能するにもかかわらず、自動検出が妨げられます。

実用的な回避策は、テーマコンポーネントを使用して、nofollowなしでトピック固有のRSSリンクを追加することです。以下に簡単な例を示します。

<!-- nofollowなしでトピック固有のRSSリンクを追加 -->
<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リンクをスキャンし、nofollowのない新しい<link>要素を<head>に挿入します。

これにより、フィードリーダーはトピック固有のフィードを自動的に検出できるようになるはずです。

別の方法として、より簡単なアプローチとして、フィードURL(例:https://community.nlnetlabs.nl/c/cascade/10.rss)をユーザーと直接共有することもできます。

この方法はDiscourseのコアを変更せずに済み、アップデートをまたいで機能します。これがフィードの自動検出が期待どおりに機能する助けになれば幸いです!

乾杯!

「いいね!」 1

差し支えなければ、そのRSSフィードリーダーの名前を教えていただけますか?

こんにちは、Aykeさん!私はhttps://github.com/spacecowboy/Feeder(F-DroidとPlayストアで入手可能)を使用しています。ユーザーがどのフィードリーダーを試したかはわかりません。

編集:ソースコードを覗いてみました:https://github.com/spacecowboy/Feeder/blob/bd98548f7a900b92c2fab9e7d5046827e12e2dbf/app/src/main/java/com/nononsenseapps/feeder/model/FeedParser.kt#L122rel=”alternate” の完全一致を検索しているようで、これが rel=”alternate nofollow” が見つからない理由です。他のフィードリーダーがより注意深ければ、これは彼らの側のバグだと私は呼びます。

結局のところ、RSSフィードの自動検出には標準が存在します: https://www.rssboard.org/rss-autodiscovery#element-link-rel。これは rel 属性内の alternate 以外のすべてを明示的に禁止しています。したがって、Discourseが生成するHTMLは標準に違反しています。だからといって必ずしも変更すべきだということではありませんが、注目すべき重要な点です。おそらく、rel=”nofollow” を追加したことで、サイトクローラーが自動検出標準に準拠していたために機能し、ユーザーのRSSフィードリーダーと区別がつかなくなり、その変更によって両方が壊れたのでしょう。

「いいね!」 1

良い発見ですね!

それなら、私のバグレポートは無効になるかもしれません。

次に適切な方法は、すべてのRSSフィードURLに対してHTTPヘッダー Link: <...> ; rel="canonical" を使用することです。
これにより、すべてのRSS URLがGoogleによって一度クロールされ、最終的に破棄されることになります。

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