Discourse SEO 개요 (sitemap / robots.txt)

Discourse에는 바로 사용할 수 있는 다양한 SEO 기능이 있습니다. 우리의 합리적인 기본 설정을 사용하면 커뮤니티 관리자는 커뮤니티 육성에만 집중할 수 있으며, 검색 엔진 최적화에 대한 걱정 없이 활동할 수 있습니다. 그렇다고 해서 변경할 수 없는 것은 아닙니다. 아래에서 변경할 수 있는 사항, 알아두어야 할 사항, 그리고 일반적인 팁과 트릭을 확인해 보세요.

검색 엔진을 위한 정적 뷰

Discourse에는 JavaScript가 없는 정적 HTML 뷰를 제공하여 웹 크롤러가 사이트를 더 빠르게 인덱싱하도록 돕습니다. 동적 뷰와 정적 뷰 사이의 콘텐츠는 동일하며, 검색 엔진이 사이트를 크롤링할 때 콘텐츠가 생략되거나 제거되지 않습니다.

사용자가 보는 것과 검색 엔진이 보는 것의 비교는 다음과 같습니다:

토픽 목록:

토픽:

크롤러 뷰 미리보기

JavaScript를 비활성화하지 않고 Discourse가 크롤러에게 제공하는 내용을 확인하는 방법은 두 가지가 있습니다:

  1. ?print URL 파라미터 — 모든 Discourse URL에 ?print를 추가합니다(예: https://yourforum.com/t/some-topic/123?print). 이는 사용자 에이전트에 관계없이 모든 브라우저에서 크롤러 레이아웃을 강제합니다. 검색 엔진이 무엇을 보는지 감사하는 가장 간단한 방법입니다.

  2. Discourse-Render: crawler 요청 헤더 — 크롤러 레이아웃을 강제하기 위해 모든 요청에 이 HTTP 헤더를 보내세요. 프로그래밍 기반 감사나 curl을 이용한 테스트에 유용합니다:

    curl -H "Discourse-Render: crawler" https://yourforum.com/t/some-topic/123
    

메타 태그

Discourse에서는 SEO에 필수적인 일반 메타 태그가 페이지에 존재하는 콘텐츠 기반으로 자동 생성됩니다. 예를 들어, 제목 태그는 사이트 또는 토픽 제목에서 파생되며, 설명은 첫 번째 게시물의 콘텐츠에서 생성됩니다. 그러나 페이지별 메타데이터 커스터마이징은 제한적입니다. 이러한 값을 변경하려면 설정 또는 값이 생성되는 콘텐츠 필드를 조정해야 합니다.

  • 제목, 설명짧은 사이트 설명 사이트 설정
  • 카테고리 이름
  • 게시물의 제목 및 콘텐츠
  • 등등 :technologist:

소셜 미디어 메타 태그

Discourse는 풍부한 소셜 공유를 위해 Open Graph 및 Twitter (X) 카드 메타 태그를 자동으로 생성합니다:

Open Graph 태그

  • og:site_name, og:type, og:url, og:title, og:description
  • og:image - opengraph_image 설정을 통해 구성 가능
  • og:article:section - 카테고리 브레드크럼
  • og:article:tag - 토픽 태그

X (구 Twitter) 카드 태그

  • twitter:card - “summary” 또는 “summary_large_image”
  • twitter:title, twitter:description, twitter:image
  • twitter:label1/data1 - 읽기 시간 추정치
  • twitter:label2/data2 - 좋아요 수

구성 설정

  • opengraph_image - 소셜 공유를 위한 기본 OG 이미지
  • x_summary_large_image - X (구 Twitter) 대형 카드 이미지

URL 구조 및 인코딩

비라틴 문자 및 URL

Discourse는 기본적으로 로케일이 EN으로 설정되어 있을 때 토픽 URL에서 비라틴 문자를 제거합니다. 이를 피하려면 로케일을 주요 비라틴 언어로 변경하거나 슬러그 생성 방법 설정을 ASCII에서 encoded(인코딩)로 변경할 수 있습니다.

국제 SEO 및 hreflang 태그

다국어 커뮤니티를 위해 Discourse는 hreflang 태그를 지원하여 검색 엔진이 사용자에게 올바른 언어 버전을 제공하도록 돕습니다. 이를 활성화하려면 다음 세 가지 설정을 구성해야 합니다(관리자 → 설정 → 로컬라이제이션):

  1. content_localization_enabled: 콘텐츠 로컬라이제이션 시스템을 활성화합니다.
  2. content_localization_supported_locales: 지원되는 로케일 코드를 정의합니다(예: en|es|fr).
  3. content_localization_crawler_param: <link rel="alternate" hreflang="..."> 태그를 생성하고 크롤러의 내부 링크를 tl 로케일 파라미터(예: /t/example-topic/123?tl=es)로 재작성하는 데 필수입니다.

이러한 설정이 활성화되면 Discourse는 각 지원 언어에 대해 대체 링크를 생성하여 Google 및 기타 검색 엔진이 사용자에게 올바른 언어 버전을 제공하도록 돕습니다.

서브폴더 vs. 서브도메인 설정

Discourse는 기술적 단순성 때문에 서브폴더보다 서브도메인을 선호합니다. Google은 두 가지 방식 사이에 특별한 선호가 없습니다[1], 하지만 Discourse는 깊은 기술적 이해가 없는 한 서브폴더 설정을 피할 것을 강력히 권장합니다.

서브폴더(예: example.com/forum/)에서 Discourse를 실행하는 경우, 루트 레벨의 robots.txt는 Discourse가 아닌 메인 웹 서버에 의해 관리됩니다. 이를 올바르게 구성하는 데 도움이 되도록, Discourse는 /robots-builder.json에 JSON 엔드포인트를 노출하여 Discourse가 생성할 정확한 disallow 규칙을 서브폴더 경로 범위로 반환합니다. 이를 서버 레벨 robots.txt를 작성하는 스크립트의 입력으로 사용할 수 있습니다.

정규화(Canonicalization)

Google은 페이지의 정규(canonical) 버전을 인덱싱하는 데 관심이 많습니다. Discourse에서 여러 답변이 있는 토픽의 경우, 정규 링크(첫 번째 게시물)가 Google에 전달되며, Google이 인덱싱 여부를 결정합니다. 20개 게시물보다 긴 토픽은 페이지 분할되며, 각 페이지는 최대 20개의 게시물을 포함하는 정규 링크가 됩니다.

예를 들어, 이 토픽의 마지막 답변에 대한 정규 태그는 https://meta.discourse.org/t/try-out-the-new-sidebar-and-notification-menus/238821?page=12가 됩니다.

allow_indexing_non_canonical_urls 설정

숨겨진 사이트 설정인 allow_indexing_non_canonical_urls(기본값: true)는 비정규 URL 변형이 X-Robots-Tag: noindex 헤더를 받는지를 제어합니다. false로 설정되면 정규 URL과 다른 URL(예: 정규가 /t/slug/123?page=3인 경우의 직접 게시물 링크 /t/slug/123/45)에 대한 모든 요청에 noindex 헤더가 함께 제공됩니다.

임베드된 토픽

토픽이 외부 웹사이트에 임베드될 때, embed_set_canonical_url 설정을 사용하여 정규 URL을 원래 임베드 위치를 가리키도록 설정할 수 있습니다. 이는 동일한 토픽이 포럼과 임베드 사이트 모두에 나타날 때 중복 콘텐츠 문제를 방지합니다.

스키마 마크업

Discourse는 검색 엔진이 콘텐츠를 이해하도록 돕기 위해 광범위한 schema.org 마크업을 사용합니다. 각 콘텐츠 유형에는 검색 결과에 표시되고 검색 가능성을 높이는 풍부한 구조화된 데이터를 포함합니다.

토픽

주요 토론 스레드를 나타내기 위해 DiscussionForumPosting 스키마를 사용하며 다음을 포함합니다:

  • headline - 토픽 제목
  • datePublished - 토픽 생성 시각
  • articleSection - 카테고리 이름
  • keywords - 모든 토픽 태그
  • publisher - 사이트/조직 정보
  • author - 최초 게시자 정보

게시물 및 답변

토픽 내 개별 게시물은 Comment 스키마를 사용하며 다음을 포함합니다:

  • author - 이름 및 프로필 링크가 있는 게시물 작성자
  • text - 게시물 콘텐츠
  • datePublisheddateModified - 생성 및 수정 타임스탬프
  • interactionStatistic - LikeAction 유형을 가진 InteractionCounter를 사용한 좋아요 수

브레드크럼

카테고리 내비게이션은 검색 결과에 표시되어 카테고리 계층 구조 경로를 보여주는 BreadcrumbList 스키마를 사용합니다. 각 브레드크럼에는 다음이 포함됩니다:

  • itemListElement - 개별 카테고리 링크
  • position - 계층 구조 내 순서
  • 시각적 구분을 위한 카테고리 색상

카테고리 및 토픽 목록

카테고리 페이지와 토픽 목록 뷰는 ItemList 스키마를 사용합니다:

  • 시간순 정렬을 위해 ItemListOrderDescending으로 정렬
  • 각 항목에 대한 위치 메타데이터 포함
  • 검색 엔진이 콘텐츠 구조와 계층을 이해하는 데 도움

홈페이지

사이트 홈페이지에는 WebSiteSearchAction을 위한 JSON-LD 구조화된 데이터를 포함하여, 사이트의 검색 결과에 Google 검색 상자가 직접 표시되도록 합니다.

소개 페이지

소개 페이지는 About 페이지 스키마와 Organization 정보를 사용하여 검색 엔진이 커뮤니티의 정체성과 목적을 이해하는 데 도움이 됩니다.

사이트맵

Discourse에는 기본적으로 enable sitemap 설정을 통해 활성화되는 /sitemap.xml에 위치한 사이트맵 인덱스가 포함되어 있습니다. 이는 검색 엔진의 인덱싱을 더 잘 촉진합니다. 다른 사이트맵도 있습니다:

  1. 최근 사이트맵 (/sitemap_recent.xml) - 지난 3일 동안 업데이트된 토픽 (1시간 캐시)
  2. 뉴스 사이트맵 (/news.xml) - Google News 형식으로 지난 72시간 동안 업데이트된 토픽 (5분 캐시), 뉴스 지향 커뮤니티에 유용
  3. 페이지 분할 사이트맵 - 페이지로 나뉘어진 토픽 전체 카탈로그 (24시간 캐시)

사이트맵은 예약된 작업을 통해 매시간 자동으로 재생성되며 마지막 수정 타임스탬프를 포함합니다. 사이트맵 페이지당 토픽 수는 sitemap_page_size 설정(기본값: 10,000)을 통해 구성할 수 있습니다.

웹 크롤러

웹 크롤러(로봇 또는 봇이라고도 함)는 웹 페이지를 인덱싱하고 콘텐츠의 검색 가능성을 높이는 데 필수적입니다. Discourse는 정교한 크롤러 감지를 사용하여 최적화된 콘텐츠를 제공하고 봇 트래픽을 효과적으로 관리합니다.

크롤러 감지

Discourse는 다양한 유형의 크롤러를 자동으로 감지하고 처리합니다:

  • 검색 엔진: Googlebot, Bingbot, DuckDuckBot 등
  • 소셜 미디어: Facebookbot, Twitterbot, LinkedInBot, Discordbot
  • AI 크롤러: GPTBot, ClaudeBot, Anthropic-AI, BrightBot
  • 아카이브 서비스: Wayback Machine, Archive.org
  • 모니터링 서비스: Lighthouse, Google Inspection Tool

크롤러가 감지되면 Discourse는 최적화된 콘텐츠를 제공하고 특수 응답 헤더를 추가합니다:

  • X-Discourse-Crawler-View: true - 크롤러 최적화 콘텐츠임을 나타냄
  • Last-Modified 헤더 - 효율적인 재크롤링 가능

크롤러 트래픽 관리

일부 크롤러는 과도하게 활동하여 포럼에 많은 요청을 보낼 수 있습니다. Discourse는 크롤러 행동을 관리하기 위한 여러 설정을 제공합니다:

  • blocked_crawler_user_agents - 특정 크롤러를 완전히 차단 (기본 차단 목록에는 mauibot, semrushbot, ahrefsbot, blexbot, seo spider가 포함됨)
  • slow_down_crawler_user_agents - 차단 대신 크롤러의 속도를 제한 (기본값에는 GPTBot, ClaudeBot과 같은 AI 크롤러가 포함됨)
  • allowed_crawler_user_agents - :warning: 주의: 이 설정을 사용하면 명시적으로 나열되지 않은 모든 크롤러(Googlebot 포함)가 차단됩니다. 크롤링을 특정 봇 집합으로 제한하려는 경우에만 사용하세요. blocked_crawler_user_agents보다 우선순위가 높습니다. 특별한 이유가 없으면 공백으로 두세요.

자동 noindex 헤더

전역 allow_index_in_robots_txt 설정 외에도 Discourse는 여러 페이지 유형에 X-Robots-Tag: noindex 응답 헤더를 자동으로 추가합니다:

  • 검색 페이지 — 항상 noindex (검색 결과는 인덱싱된 페이지로서 유용하지 않음)
  • 배지 페이지 — 항상 noindex
  • 그룹 페이지 — 항상 noindex
  • 사용자 프로필 페이지 — 항상 noindex
  • 태그 필터/교차 페이지 — noindex (태그 인덱스 및 표시 페이지는 예외임)
  • RSS/Atom 피드 — 항상 noindex

이것들은 컨트롤러 레벨에서 적용되며 구성할 수 없습니다. 일시적, 저가치 또는 중복 콘텐츠 페이지가 검색 엔진 인덱스를 오염시키지 않도록 보장합니다.

크롤러 분석

관리자는 관리자 → 보고서 → 웹 크롤러에서 크롤러 활동을 모니터링하여 어떤 봇이 사이트에 액세스하고 얼마나 자주 액세스하는지 확인할 수 있습니다.

추가 SEO 기능

llms.txt를 통한 AI 크롤러 가이드

Discourse는 llms.txt 컨벤션을 지원하며, 이는 LLM 기반 크롤러(AI 어시스턴트에서 사용되는 크롤러 등)가 사이트의 콘텐츠와 구조에 대해 안내받을 수 있는 표준 방식을 제공합니다.

활성화하려면:

  1. LLM 크롤러를 위해 사이트를 설명하는 .txt 또는 .md 파일(최대 512 KB)을 준비합니다
  2. llms_txt 사이트 설정(관리자 → 설정 → 보안)을 통해 업로드합니다
  3. https://yourforum.com/llms.txt에서 제공됩니다

:information_source: llms.txtrobots.txt와 구별되며, LLM 기반 크롤러를 안내하기 위해 특별히 설계되었습니다. 액세스 규칙을 제공하는 대신, 사이트가 무엇인지, 어떤 콘텐츠를 포함하는지, AI 어시스턴트가 어떻게 이해하고 사용해야 하는지에 대한 의미론적 맥락을 제공합니다. robots.txt가 봇에게 ‘어디로 갈 수 있는지’를 알려준다면, llms.txt는 AI에게 ‘무엇을 보고 있는지’와 ‘왜 중요한지’를 알려줍니다.

OpenSearch 통합

Discourse는 /opensearch.xml에 OpenSearch 설명을 제공하여 브라우저 검색 통합을 가능하게 합니다. 사용자는 포럼을 브라우저의 검색 엔진 목록에 직접 추가할 수 있습니다.

RSS 피드

각 토픽에는 /t/{slug}/{id}.rss에서 사용할 수 있는 RSS 피드가 있으며, 다음을 포함합니다:

  • 토픽 제목 및 설명
  • 작성자 정보가 포함된 모든 게시물/답변
  • 게시 날짜 및 마지막 업데이트 시각
  • 카테고리 및 태그

:warning: 참고: RSS 피드 경로(/t/*/*.rss, /c/*.rss)는 대부분의 크롤러가 중복 콘텐츠를 인덱싱하는 것을 방지하기 위해 일반 * 와일드카드 에이전트에 대해 robots.txt에서 차단됩니다. Googlebot은 이 제한에서 명시적으로 예외이며 RSS 피드에 액세스할 수 있습니다.

Google 사이트 인증

google_site_verification_token 설정을 사용하여 테마 템플릿을 편집하지 않고 Google Search Console 인증 메타 태그를 추가할 수 있습니다.

프로그레시브 웹 앱 (PWA)

Discourse는 모바일 앱 검색 및 설치 프롬프트를 위해 /manifest.json에 웹 앱 매니페스트를 생성합니다.

마이그레이션 및 URL 리디렉션

퍼malink 기능은 SEO를 유지하고 “페이지를 찾을 수 없음” 오류를 방지하며, 검색 엔진이 인덱싱을 쉽게 할 수 있도록 올바른 메타데이터를 제공하기 위해 오래된 URL을 리디렉션하는 데 사용됩니다.

커뮤니티 사이트가 당사 팀에 의해 Discourse로 마이그레이션되는 경우, 타당한 이유가 없는 한 URL 리디렉션이 포함됩니다.

기존 가져오기 스크립트 중 하나를 사용하는 경우, 스크립트가 이를 처리하도록 확인해야 합니다[2]. 관리 패널의 커스터마이즈퍼malink에서 수동으로 permalink를 추가할 수 있습니다.

인덱싱 해제 방법

Google 인덱스에서 페이지를 제거하려면 콘텐츠를 제거하거나 페이지에 대한 액세스를 차단할 수 있습니다. 필요에 따라 사이트 전체를 비공개로 설정할 수 있습니다[3]. 토픽을 삭제하거나 제한된 카테고리에 배치하여 제외할 수 있습니다. 숨겨진 토픽은 기본적으로 인덱싱되지 않지만, 해당 토픽으로 리디렉션되는 공개 링크가 어딘가에 있는 경우 인덱싱될 수 있습니다.

영구적인 제거를 위해 Google Search Console의 제거(Removals) 도구를 사용하면 검색 결과에서 페이지를 유지하는 데 도움이 됩니다. 자세한 내용은 Remove information on your website from Google - Search Console Help 확인하세요.


  1. ↩︎

  2. 가져오기 스크립트에서 permalink 문자열을 찾으면 이 정보를 얻을 수 있습니다. ↩︎

  3. 로그인 필요 설정을 찾아보세요. ↩︎

21개의 좋아요