RSS 피더 자동 탐색이 주제별 피더를 놓칠 수 있습니다

안녕하세요! NLnet Labs에서는我们的产品(community.nlnetlabs.nl)을 위해 Discourse를 설정해 왔습니다. 한 사용자가 특정 주제(예: https://community.nlnetlabs.nl/c/cascade/10)의 RSS 피드를 받는 방법에 대해 질문했는데, 그의 RSS 리더에서 해당 피드를 찾을 수 없었기 때문입니다.

저도 해당 주제 전용 페이지를 제가 사용하는 RSS 피드 리더로 시도해 보았지만, 두 개의 피드만 발견했습니다: “NLnet Labs Community - Latest Posts”(/posts.rss)와 “NLnet Labs Community - Latest topics”(/latest.rss). /c/cascade/10.rss가 유효한 RSS 피드임은 알고 있지만, 제 피드 리더가 자동으로 이를 찾지 못했습니다. 이는 다소 좌절스러운 상황입니다. 앞으로 이러한 URL을 직접 안내해야 하기 때문입니다.

개인 웹사이트에 대한 RSS 피드 자동 발견(auto-discovery)을 조사해 본 경험이 있어, 웹 페이지의 <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 피드를 위한 세 번째 링크가 실제로 포함되어 있습니다. 하지만 일부 RSS 피드 리더가 rel="nofollow" 속성을 지원하지 않는 것으로 보입니다.

물론 MDN(rel HTML attribute - HTML | MDN)도 확인해 보았습니다. nofollow는 다음과 같이 문서화되어 있습니다:

현재 문서의 원래 저자 또는 게시자가 참조된 문서를 보증하지 않음을 나타냅니다.

또한 다음과 같이도 설명되어 있습니다:

<form>, <a>, <area> 태그에 관련되는 nofollow 키워드는 검색 엔진 스파이더가 링크 관계를 무시하도록 지시합니다. nofollow 관계는 현재 문서의 소유자가 참조된 문서를 보증하지 않음을 나타낼 수 있습니다. 이는 검색 엔진 최적화(SEO) 전문가들이 자신의 링크 팜이 스팸 페이지가 아님을 가장하기 위해 자주 포함합니다.

GitHub의 Discourse 소스 코드를 살펴보고 몇 가지 검색과 Git blame을 통해 FEATURE: add nofollow to RSS alternate link in topics and categories - 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년에 이미 병합되었음에도 불구하고요. 분명히 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가 있는 링크를 무시하므로, 피드 자체는 유효하고 직접 접근 시 정상적으로 작동하더라도 자동 발견이 차단됩니다.

실용적인 해결책은 **테마 컴포넌트(Theme Component)**를 사용하여 nofollow 없이 주제별 RSS 링크를 추가하는 것입니다. 간단한 예시는 다음과 같습니다:

<!-- Add topic-specific RSS links without 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 링크를 스캔하여 nofollow가 없는 새로운 요소를 에 주입합니다.

이제 피드 리더가 주제별 피드를 자동으로 감지해야 합니다.

또는 더 간단한 방법으로, 사용자에게 피드 URL을 직접 공유하는 것도 좋습니다. 예를 들어 Cascade - NLnet Labs Community 와 같이요.

이 방법은 Discourse 코어를 수정하지 않으며 업데이트에도 영향을 받지 않습니다. 피드 자동 발견이 예상대로 작동하는 데 도움이 되길 바랍니다!

감사합니다!

1개의 좋아요

어떤 RSS 피드 리더를 사용하시는지 여쭤봐도 될까요?

하이 Ayke! 저는 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 피드 자동 발견에 대한 표준이 실제로 존재합니다: https://www.rssboard.org/rss-autodiscovery#element-link-rel. 이 표준은 rel 속성에 alternate를 제외한 어떤 값도 명시적으로 허용하지 않습니다. 따라서 Discourse가 생성하는 HTML은 표준을 위반하고 있습니다. 이것이 반드시 변경되어야 한다는 뜻은 아니지만, 중요한 점을 알아두어야 합니다. 아마도 rel="nofollow"를 추가한 것이 해당 사이트 크롤러에서 작동했던 이유는, 크롤러가 사용자의 RSS 피드 리더와 구별되지 않는 상태에서 자동 발견 표준을 준수하고 있었기 때문일 수 있으며, 이번 변경으로 인해 크롤러와 피드 리더 양쪽 모두에 문제가 발생했을 수 있습니다.

1개의 좋아요

좋은 지적이네요!

그러면 제 버그 리포트는 무효가 될 수도 있겠네요:

rel="nofollow를 사용하는 다음 적절한 방법은 모든 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개의 좋아요