DiscourseのSEO概要(サイトマップ/robots.txt)

Discourse には、インストール直後から動作する多くの SEO 機能があります。私たちの設定したデフォルト値を活用することで、コミュニティ管理者は検索エンジン最適化に気を取られることなく、コミュニティの育成に集中できます。とはいえ、変更可能な項目や知っておくべき事項、そして一般的なヒントやコツが以下にまとめられています。

検索エンジン向けの静的ビュー

Discourse には、JavaScript を含まない静的 HTML ビューがあり、これによりウェブクローラーがサイトをより高速にインデックス作成できます。動的ビューと静的ビューのコンテンツは同一であり、検索エンジンによるサイトクロール時にコンテンツが省略や削除されることはありません。

以下は、ユーザーが閲覧する内容と検索エンジンが閲覧する内容の比較です:

トピック一覧:

トピック:

クローラービューのプレビュー

JavaScript を無効化することなく、Discourse がクローラーに提供するコンテンツを確認する方法は 2 つあります:

  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) Card のメタタグを自動生成します:

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 から非ラテン文字を削除します。これを避けるには、ロケールを主要な非ラテン言語に変更するか、slug generation method(スラッグ生成方法)設定を ASCII から encoded に変更します。

国際 SEO と hreflang タグ

多言語コミュニティ向けに、Discourse は hreflang タグをサポートしており、検索エンジンが正しい言語バージョンをユーザーに提供するのに役立ちます。これを有効にするには、以下の 3 つの設定を必ず構成する必要があります(管理者 → 設定 → ローカライゼーション):

  1. content_localization_enabled:コンテンツローカライゼーションシステムを有効にします。
  2. content_localization_supported_locales:サポートされるロケールコードを定義します(例:en|es|fr)。
  3. content_localization_crawler_param\u003clink rel="alternate" hreflang="..."\u003e タグを生成し、クローラーに対して tl ロケールパラメータ(例:/t/example-topic/123?tl=es)を含む内部リンクを書き換えるために必須です。

これらの設定を有効にすることで、Discourse は各サポート言語の代替リンクを生成し、Google などの検索エンジンが正しい言語バージョンをユーザーに提供するのに役立ちます。

サブフォルダとサブドメインの設定

Discourse は、技術的な簡易さからサブフォルダよりもサブドメインを推奨しています。Google は両者に明確な好みを持っていません[1] が、Discourse は深い技術的知識がない限り、サブフォルダ設定を避けることを強く推奨しています。

Discourse をサブフォルダ(例:example.com/forum/)で実行している場合、ルートレベルの robots.txt は Discourse ではなく、メインのウェブサーバーによって管理されます。これを正しく設定するために、Discourse は /robots-builder.json という JSON エンドポイントを公開しており、ここでサブフォルダパスに限定された Discourse が生成する正確な disallow ルールを返します。これを入力として使用し、サーバーレベルの robots.txt を書き込むスクリプトを作成できます。

キーノニカル化

Google はページのキーノニカル(正規)バージョンのインデックス作成を重視しています。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 - 投稿コンテンツ
  • datePublished および dateModified - 作成と編集のタイムスタンプ
  • interactionStatistic - LikeAction タイプの InteractionCounter を使用したいいね数

パンくずリスト

カテゴリナビゲーションは、検索結果に表示されカテゴリ階層パスを示す BreadcrumbList スキーマを使用します。各パンくずには以下が含まれます:

  • itemListElement - 個別のカテゴリリンク
  • position - 階層内の順序
  • 視覚的な区別のためのカテゴリカラー

カテゴリとトピック一覧

category ページとトピック一覧ビューは ItemList スキーマを使用します:

  • 時系列ソートのために ItemListOrderDescending で順序付け
  • 各アイテムの位置メタデータを含む
  • 検索エンジンがコンテンツ構造と階層を理解するのに役立ちます

ホームページ

サイトホームページには、WebSiteSearchAction の JSON-LD 構造化データが含まれており、これにより Google の検索ボックスが検索結果に直接表示されます。

About ページ

About ページは、About ページスキーマと Organization 情報を使用しており、検索エンジンがコミュニティのアイデンティティと目的を理解するのに役立ちます。

サイトマップ

Discourse には、デフォルトで enable sitemap 設定により有効になっている /sitemap.xml にある サイトマップインデックス が組み込まれており、検索エンジンによるインデックス作成を促進します。他にも以下のサイトマップがあります:

  1. 最近のサイトマップ (/sitemap_recent.xml) - 過去 3 日以内に更新されたトピック(1 時間キャッシュ)
  2. ニュースサイトマップ (/news.xml) - Google ニュース形式で過去 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 規約をサポートしており、AI アシスタントなどが使用する LLM ベースのクローラーに対して、サイトのコンテンツと構造に関する標準的なガイダンスを提供します。

有効にするには:

  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 に Web App Manifest を生成します。

マイグレーションと URL リダイレクト

パーマリンク機能は、古い URL のリダイレクトに使用され、SEO の維持、「ページが見つかりません」エラーの防止、および検索エンジンがインデックス作成を容易に行えるよう正しいメタデータを提供することを目的としています。

コミュニティサイトが当チームによって Discourse にマイグレーションされる場合、有効な理由がない限り、URL リダイレクトが含まれます。

既存のインポートスクリプトのいずれかを使用している場合、スクリプトがこの処理を行うようにする必要があります[2]。管理者パネルの カスタマイズパーマリンク から、手動でパーマリンクを追加できます。

インデックス解除方法

Google のインデックスからページを削除するには、コンテンツを削除するか、ページへのアクセスをブロックします。ニーズに応じて、サイト全体をプライベートに設定できます[3]。トピックを削除するか、制限されたカテゴリに配置することで、特定のトピックを除外できます。非表示のトピックはデフォルトではインデックスされませんが、それを指す公開リンクがある場合はインデックスされる可能性があります。

永続的な削除には、Google Search Console の削除ツールを使用して、ページを検索結果から除外するのが有効です。詳細は Remove information on your website from Google - Search Console Help を参照してください


  1. ↩︎

  2. インポートスクリプトでパーマリンク文字列を検索すると、この情報が得られます。 ↩︎

  3. ログイン必須設定を探してください。 ↩︎

「いいね!」 21