RSS 중복 콘텐츠로 인한 SEO 문제

블로그 게시물을 카테고리 내에서 토론 앵커로 만들기 위해 RSS 플러그인(또는 수동 복사)을 사용하고 있습니다. Google은 이러한 "복사"된 콘텐츠를 좋아하지 않으며, 블로그의 SEO 평판에 피해를 줄 수 있다고 경고합니다.

물론 Discourse(또는 해당 카테고리)의 Google 인덱싱을 중지할 수는 있지만, 이것이 의도된 동작임을 정의하는 방법에 대해 경험하신 분이 계신가요? 예를 들어 "이 서브도메인은 블로그에 속하며, 링크 팜을 시도하는 것이 아닙니다"와 같은 것 말입니다. 그렇다면 이를 Discourse 설정에서 어떻게 구현해야 할까요?

rel=nofollow 또는 유사한 태그를 사용하면 최소한 백링크 팜 측면은 해결할 수 있을 것 같습니다(콘텐츠 중복 측면에 대해서는 확실하지 않음). 아마도 Google을 안심시킬 수 있는 "이것은 ~의 복사본입니다"라는 헤더가 있을까요?

embed set canonical url 사이트 설정이 이 문제를 해결하는 데 도움이 될 수 있습니다:

다만, Google의 문서도 살펴볼 가치가 있습니다:

문서를 링크한 이유는 embed truncate 설정이 활성화된 상태에서 embed set canonical url 설정을 활성화하는 경우에 대해 확신이 서지 않기 때문입니다. embed truncate가 활성화되면, Google이 Discourse에서 크롤링할 수 있는 것은 원래 기사의 일부 스니펫뿐입니다. 사용자가 “전체 게시물 보기” 버튼을 클릭하면 전체 기사가 iframe으로 표시됩니다. iframe의 콘텐츠는 Google에 의해 크롤링되지 않는다고 확신합니다. “5가지 흔한 실수” 문서의 첫 번째 항목은 이 문제를 어느 정도 다루고 있습니다.

힌트 감사합니다, Simon! 실제로 canonical이 제가 생각하던 것이 맞네요. 시도해 보았지만 완전히 동작하지 않습니다. RSS 소스가 아니라 자기 자신을 가리키는 canonical URL이 삽입됩니다:

<link rel="canonical" href="https://community.domain.com/t/invoicing-mandate/537?page=0" />

대신 이렇게 되어야 합니다:

<link rel="canonical" href="https://blog.domain.com/t/invoicing-mandate/537" />

(이것은 stable/3.2.0 버전입니다)

또한, 이것을 featured link로 설정해도/해야 하는가요?

우리의 경우 truncate를 사용하지 않습니다(단, RSS 피드는 이미 잘려 있습니다). 하지만 구글이 그래도 받아들일 것으로 기대합니다.

브라우저의 웹 인스펙터로 보는 대신 페이지 소스를 직접 확인해 보세요. 페이지 소스를 볼 때 canonical URL이 RSS 게시물의 URL로 설정되어 있고, 웹 인스펙터로 HTML을 볼 때는 Discourse 토픽의 URL로 설정되어 있는 것을 볼 수 있을 거예요. 만약 그렇다면 RSS 토픽에 대해 중복 콘텐츠 경고가 표시되지 않아야 합니다.

embed set canonical url을 활성화한 상태에서, Discourse의 RSS 피드로 가져온 토픽을 웹 인스펙터로 볼 때 제가 확인하는 내용은 다음과 같습니다:

그리고 페이지 소스를 볼 때(페이지에서 마우스 오른쪽 버튼을 클릭하고 메뉴에서 "페이지 소스 보기"를 선택)의 canonical URL은 다음과 같습니다:

<link rel="canonical" href="https://blog.discourse.org/2023/03/how-discourse-scaled-to-10m-arr-with-only-1-salesperson" />

canonical URL이 올바르게 설정된 페이지 소스 보기 버전이 크롤러가 실제로 보는 것입니다.

차이를 확인할 수 있는 또 다른 방법은 웹 인스펙터를 사용하되 사용자 에이전트로 Googlebot을 선택하는 것입니다:

크롤러가 보는 측면에서 설정은 예상대로 작동하는 것 같지만, 저에게는 혼란스러웠습니다. 문제는 JavaScript가 활성화된 상태로 페이지를 볼 때 Discourse가 JavaScript를 통해 canonical URL 속성을 덮어쓰는 것 같습니다. 참고로, 해당 동작은 여기서 발생한다:

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/instance-initializers/meta-tag-updater.js#L25-L27

RSS 피드로 생성된 토픽에 featured link를 설정하는 것은 (현재로서는) 불가능하다고 생각합니다. SEO 전문가가 아니지만, 설정하든 안 하든 SEO에 영향을 미치지 않을 것 같습니다.

저는 curl -i | grep canon을 사용해 보았지만 잘못된 태그 URL(그리고 헤더도 없음)을 확인했습니다. 하지만 다른 UA로 다시 시도해 볼 수 있습니다(다소 이상하긴 하지만,) - 몇 번이나 게시글을 다시 생성해야 했기 때문에 제가 혼동한 것일 수도 있습니다. 여기서 업데이트하겠습니다.

맞습니다, 해당 링크는 SEO를 위한 것이 아니라 블로그 링크를 더 눈에 띄게 하고 싶다는 내부적인 욕구가 있었기 때문입니다. 그리고 같은 URL이니까요..

(하지만 요구사항 목록이 더 길어지는 것 같으니 rss-poll을 포크해야 할 것 같습니다(불행히도 대부분의 작업이 플러그인에서 이루어지지 않는 것처럼 보입니다). 임베드 코드도 확장 가능한가요?

RSS 피드로 생성된 토픽의 경우, embed set canonical url이 활성화되어 있다면 curl -i가 RSS 항목의 URL을 canonical URL로 반환해야 한다고 기대합니다. 제 로컬 사이트에서 테스트를 해보면 이 기능이 정상적으로 작동합니다.

Discourse Rails 콘솔에 접근 권한이 있다면, 토픽을 찾아 그 topic_embed 속성을 확인함으로써 무슨 일이 일어나고 있는지 확인할 수 있습니다. 예를 들어:

t = Topic.find 495
t.topic_embed

또는 단순히:

TopicEmbed.find_by(topic_id: 495)

TopicEmbed 객체가 반환되어야 합니다. 이 객체의 embed_url은 Discourse가 토픽의 canonical URL로 설정하는 데 사용될 것으로 기대되는 값입니다.

저도 이에 대해 궁금해한 적이 있습니다. 임베딩은 Discourse 코어 코드的一部分이므로, RSS 플러그인에 변경 사항을 가하는 것보다 더 복잡할 것입니다.