WordPress 임베드로 게시된 오래된 주제에 x-robots: noindex 및 canonical 태그가 없습니다

여러분, 안녕하세요.

WordPress에서 Discourse로 자동 게시된 오래된 주제(토론)에서 이상한 현상을 발견했습니다. 이 주제는 댓글 섹션으로 사용됩니다.

보통 이렇게 게시된 게시물은 Discourse가 HTTP 헤더에 X-Robots-Tag: noindex를 올바르게 추가하고, WordPress 블로그 게시물로 돌아가는 canonical URL을 설정합니다.

하지만 오래된 주제에서는 이러한 태그가 사라지는 것을 발견했습니다. noindex 헤더가 사라지고, canonical 태그도 더 이상 존재하지 않습니다. 이 문제가 발생하는 주제의 예시는 다음과 같습니다:

이 문제를 해결하는 방법을 아시는 분 계신가요?

정확히 얼마나 많은 주제가 영향을 받았는지 알 수 있는 방법이 없지만, 꽤 많은 수의 주제가 영향을 받은 것으로 보입니다.

카테고리(또는 태그?) 설정에 체크박스가 있었다면, 활성화할 경우 해당 카테고리 아래 게시된 모든 주제에 자동으로 noindex가 추가되었으면 좋겠습니다. 예를 들어 다음과 같은 형태라면 좋습니다:

[ ] 이 카테고리의 주제를 검색 결과에서 숨기기.

티아고, 안녕하세요.

제 이해가 맞는지 확인차, 다음 내용을 말씀하신 거죠?

  1. 사이트 설정에서 Embed set canonical URL이 활성화되어 있고, 항상 활성화되어 있었음.
  2. 지난 몇 달간 WordPress Discourse 플러그인을 통해 WordPress에서 Discourse로 여러 개의 주제를 게시함.
  3. 최근까지 2에서 설명한 대로 게시된 모든 Discourse 주제의 head에는 href가 WordPress URL로 설정된 link rel="canonical"이 포함되어 있었음.
  4. 최근 어떤 시점부터, 이전에 3에 부합하던 주제 중 일부는 이제 href가 Discourse URL로 설정된 link rel="canonical"을 가지고 있음.

이렇게 이해한 게 맞나요?

안거스, 안녕!

네, 맞습니다.

embed set canonical URL도 활성화되어 있습니다:

여기에서 새 주제들이 noindex + canonical 태그와 함께 게시되는 것을 볼 수 있습니다. 하지만 이 태그가 없는 오래된 주제들을 보고 있습니다.

티아고, 서버에 접근 권한이 있다면 canonical url이 작동하지 않는 토픽의 id를 확인해 주세요. 그런 다음 다음 명령을 rails 콘솔에서 실행하고 결과를 공유해 주시겠습니까?

./launcher enter app
rails c
TopicEmbed.with_deleted.find_by(topic_id: 여기 토픽 id를 입력하세요)
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:73608)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:79015)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:74248)
=> nil
discourse(prod)> TopicEmbed.with_deleted.find_by(topic_id:76598)
=> nil

그것이 바로 문제입니다. 임베드(canonical url) 기능이 작동하려면 해당 토픽에 topic_embed 레코드가 있어야 합니다. 해당 토픽들이 임베드 레코드를 가지고 있지 않을 수 있는 이유가 무엇일지 생각해 볼 수 있을까요?

솔직히 그 토픽들이 topic_embed 레코드를 누락하게 된 원인이 무엇인지 정확히 모르겠습니다.

하지만 더 큰 그림을 본다면, 제가 이전에 제안했던 구성 방식을 따르는 것이 더 합리적이지 않을까요? 카테고리 설정에 noindex를 해당 카테고리 내 모든 토픽에 적용할 수 있는 체크박스를 직접 추가한다면, 임베드 기능을 의존하거나 해당 레코드가 실제로 존재하는지 걱정할 필요가 없게 됩니다.

그 구성이 사용자의 사이트에는 합리적일 수 있지만, 주제 임베드 캐노니컬 URL이 작동하는 방식과는 다른 기능입니다. 해당 기능을 구축할 수는 있지만, 커스텀 플러그인으로 직접 구현해야 합니다.

임베드용 캐노니컬 URL은 의도대로 작동하고 있습니다. 다만, 어떤 시점에 임베드 레코드가 삭제되었거나 사용자의 사이트에서 다른 작업이 수행된 것으로 보입니다. Discourse는 주제 임베드 레코드를 영구 삭제하지 않으므로, 다른 원인이 있었을 것입니다. 커스텀 작업을 수행하지 않는 한, 해당 주제들을 다시 게시하여 임베드 레코드를 다시 생성해야 합니다.

이 기능은 토픽 임베드와 동작 방식이 다르지만, 카테고리 수준의 인덱싱 제어는 모든 최신 CMS의 기본 SEO 요구사항입니다. 이 주제에 대한 다른 메타 토픽도 여러 개 있으며, 이를 네이티브 기능으로 지원하면 여러 사용 사례를 한 번에 해결할 수 있습니다.

Ruby가 제 주 스택이 아니기 때문에 AI를 활용해 플러그인을 만들어 볼 수도 있지만, 이 기능은 정말로 네이티브로 제공되어야 합니다.

누락된 레코드와 관련하여, 이를 유발할 수 있는 데이터베이스 명령어나 작업을 실행한 적이 없습니다. 또한 재게시도 현실적인 해결책이 아닙니다. 게시물이 약 50,000개에 달하며, 어떤 게시물들이 영향을 받았는지도 정확히 알지 못합니다. 이를 수정하려면 모든 항목을 찾아 삭제하고 다시 게시하기 위한 복잡한 API 스크립트가 필요합니다…

특정 카테고리 내 모든 토픽에 X-Robots-Tag: noindex 헤더를 추가하는 플러그인을 바이브 코딩으로 만들었습니다. 혹시 이 기능을 찾고 계신 분이 있다면, 여기 있습니다: GitHub - mobilon/tb-discourse-seo: Allows you to add a "X-Robots-Tag: noindex" tag in all topics from a specific category · GitHub

플러그인 작업 잘하셨습니다. 아직 헤더가 사라진 어떤 기존 주제인지 찾아야 하는 분들을 위해, 외부에서도 확인할 수 있습니다 — rails도, 데이터베이스도 필요 없습니다:

curl -s https://EXAMPLE.COM/sitemap_1.xml \

| grep -o 'https://[^<]*/t/[^<]*' \

| while read -r u; do

curl -sI "$u" | grep -qi 'x-robots-tag: *noindex' || echo "$u"

done > missing-noindex.txt

sitemap.xml은 일반적으로 하위 사이트맵을 가리키는 인덱스이므로, 먼저 하위 사이트맵을 확장한 뒤 각각에 대해 이 명령을 실행하세요. 사이트가 레이트 리미팅을 적용하고 있다면 sleep을 추가하세요.

나중에 이 내용을 찾는 분들을 위해 구분할 가치가 있는 한 가지: 헤더와 캐노니컬은 두 개의 독립적인 신호이며, 각각 독립적으로 실패할 수 있습니다 — 주제가 X-Robots-Tag를 잃어버리고도 올바른 캐노니컬을 유지하거나, 그 반대의 경우도 가능합니다. 둘 다 확인하세요:

curl -sI URL | grep -i x-robots

curl -s URL | grep -i 'rel="canonical"'