xml-sitemap について
xml-sitemapは、XMLサイトマップの作成、監査、最適化を支援するテクニカルSEOスキルです。URLの選定から仕様に沿った生成、robots.txtへの記載、送信状況の確認までを案内します。
主な機能
- 01サイトマップの必要性とURL情報の評価
- 02仕様に準拠したXMLサイトマップの生成
- 03大規模・多言語サイトマップの分割
- 04インデックス対象ページの選定と除外
- 05robots.txtへのサイトマップ記載
- 06GSCでの送信と確認の案内
活用シーン
- 01ページ一覧からサイトマップを作成
- 02上限を超えるサイトのサイトマップを整理
- 03多言語サイトのURLを整理
- 04取得エラーやXML形式の問題を診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kostja94/ marketing-skills --skill xml-sitemapインストール後、Claude Code で/xml-sitemapを入力して読み込まれたか確認します。
詳細
SEO テクニカル:サイトマップ
検索エンジンによる発見のためのサイトマップの作成、監査、最適化を案内します。
実行時:初回の使用では、このスキルの内容と重要性について役立つ場合は1〜2文で簡単に説明してから、主な出力を提示してください。2回目以降の使用時や、ユーザーが省略を求めた場合は、主な出力に直接進んでください。
スコープ(テクニカル SEO)
- サイトマップ:XML サイトマップを作成し、Google Search Console に送信します
- URL の発見:検索エンジンによるページの発見を支援します。大規模なサイトや内部リンクが不十分なサイトでは特に重要です
タスク
プロジェクトのページ一覧から、sitemaps.org プロトコルに準拠した XML サイトマップを生成し、robots.txt で宣言します。
初期評価
プロジェクトのコンテキスト: ルートに contextus.md がある場合は読み込み、このタスクに関連するモジュールのみを読み込んでください。Contextus がない場合は、利用可能なプロジェクト資料またはユーザーが提供した事実を使用し、不足情報を確認してください。別のコンテキストシステムを作成してはいけません。
以下を確認します:
- サイト URL:ベースドメイン(例:
https://example.com) - URL 数:インデックス登録可能なページの合計数(単一サイトマップかサイトマップインデックスか)
- データソース:静的設定、CMS、ファイルシステム、またはハイブリッド
前提条件:サイトマップは必要ですか?
生成する前に、サイトマップが必要かどうかを評価してください。サイトマップは、次の場合に特に有効です:
- 大規模なサイト(数百ページ以上)、または被リンクの少ない新しいサイト
- 内部リンクから見つけにくい深い階層のページや孤立したページ
- 拡張メタデータが必要なリッチメディア(画像、動画、ニュース)
- GSC で「検出 - インデックス未登録」または「未検出」の件数が増加している
内部リンクが充実した小規模サイト(50ページ未満)では、必ずしもサイトマップは必要ありません。ただし、サイトマップの作成コストはほぼゼロであり、将来に備えた基盤になります。判断に迷う場合は、作成する方向で対応してください。
1. プロトコルの基本
| 項目 | 仕様 |
|---|---|
| 単一サイトマップの上限 | 50,000 URL、50MB(非圧縮時) |
| サイトマップインデックス | 上限を超える場合は分割し、メインインデックスからサブサイトマップを参照します |
| エンコーディング | UTF-8 |
| URL 形式 | 完全な URL、同一ホスト、https:// を含める |
| 必須タグ | <loc> |
| 任意タグ | <lastmod>、<changefreq>、<priority> |
2. フィールドの要件
| フィールド | 説明 | 推奨 |
|---|---|---|
| url | 完全な URL | https://example.com/path |
| lastModified | ページの最終更新日時 | ページのメタデータを使用し、ISO 8601 形式にします。データがない場合は YYYY-MM-DD を使用するか、省略します |
| changeFrequency | 更新頻度 | ホームページは daily、一覧ページは weekly、コンテンツページは monthly |
| priority | 相対的な重要度 | ホームページは1.0、集約ページは0.9、コンテンツページは0.7〜0.8、その他は0.5〜0.6 |
lastmod(重要)
- 正確である必要があります:サイトマップの生成時刻ではなく、実際のページ更新時刻を反映させます。Google は検証可能性を求めており、Bing によると、サイトマップの約18%に不正確な lastmod 値が含まれています。
- 形式:W3C 日時形式(
YYYY-MM-DDまたはYYYY-MM-DDTHH:MM:SS+TZD)。例:2025-01-15、2025-01-15T14:30:00+08:00。 - 避けること:lastmod に
new Date()を使用すると、すべての URL が同じタイムスタンプになり、検索エンジンに無視される可能性があります。 - 適用するタイミング:コンテンツ、構造化データ、または重要なリンクを変更したとき。
changefreq / priority
- changefreq:あくまで目安であり、クロール頻度を直接決定するものではありません。値:
always、hourly、daily、weekly、monthly、yearly、never。 - priority:0.0〜1.0。ランキングには影響しません。重要なページには高い値を設定し、すべてに同じ値を設定するのは避けてください。
3. アーキテクチャと分割
単一サイトマップ
- URL が50,000件を超える場合は、
/sitemap.xmlを直接生成します。
サイトマップインデックス(複数のサブサイトマップ)
- 上限を超える場合は、種類または言語ごとに分割し、メインインデックスからサブサイトマップを参照します。
- 分割例:
/sitemap/posts.xml、/sitemap/pages.xml、/sitemap/zh.xml、/sitemap/en.xml。 - メインインデックスは
/sitemap.xmlまたは/sitemap-index.xmlとして出力し、各エントリを<sitemap><loc>...</loc></sitemap>とします。
多言語サイト
- ロケール別に分割:
/sitemap/zh.xml、/sitemap/en.xml。 - またはコンテンツタイプ + 言語別:
/sitemap/zh-posts.xml、/sitemap/en-posts.xml。
多言語サイトマップ (サイトマップ内の hreflang)
多言語サイトでは、各 <url> エントリ内に xhtml:link hreflang 代替を追加します。大規模サイト (多言語ページ 100 以上) に推奨。hreflang 管理を一元化できます。
ルール:
- すべての言語バージョンは、自分自身を含む他のすべての言語バージョンにリンクする必要があります (自己参照)。
- デフォルトロケールを指す
x-defaultを含めます。 xmlns:xhtml="http://www.w3.org/1999/xhtml"名前空間を使用します。<loc>は通常、デフォルトロケール (クリーン) URL を使用します。x-defaultもそこを指します。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/page</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/page" />
<xhtml:link rel="alternate" hreflang="zh" href="https://example.com/zh/page" />
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page" />
</url>
</urlset>
サイトマップインデックスにすべての言語サイトマップをリストします。robots.txt にも含めます。
4. 実装
| 技術スタック | 実装 |
|---|---|
| Next.js App Router | app/sitemap.ts で MetadataRoute.Sitemap または generateSitemaps をエクスポート |
| Next.js Pages Router | pages/sitemap.xml.ts、または getServerSideProps で XML を返す |
| Astro | src/pages/sitemap-index.xml.ts または @astrojs/sitemap |
| Vite / 静的ビルド | ビルドスクリプトが public/sitemap.xml を生成 |
| その他 | 静的な /sitemap.xml を生成、または API 経由で動的に返す |
ルートの除外
- プロジェクトに i18n / ミドルウェアのリダイレクトがある場合、リダイレクトを避けるためにサイトマップのパスを除外します。
- 例 (Next.js matcher):
'/((?!api|_next|sitemap|sitemap-index|.*\\..*).*)'。
5. ページの範囲
含める
- ホーム:
/ - ロケール/リージョンのホームページ (例:
/zh、/en) - インデックス可能なすべてのコンテンツページ、リストページ、カテゴリページ
除外する
/api/*、/admin/*、/_next/*- 静的アセット (画像、JS、CSS など)。画像の検出には 画像サイトマップ 拡張機能を使用します — image-optimization を参照してください。動画の検出には 動画サイトマップ 拡張機能を使用します — video-optimization を参照してください
- ログイン、管理、下書き、その他インデックスを意図しないページ
6. データソースとメンテナンス (信頼できる唯一の情報源)
- 信頼できる唯一の情報源: URL リストは設定、CMS、またはメタデータから読み取ります。サイトマップ内でのハードコーディングは避けます。
- 複数のページタイプ: ツール、ブログ、マーケティングページを 1 つの配列に統合して一括生成できます。
- 新しいページ: データソースに追加するだけで、サイトマップは自動的に更新されます。複数箇所でのメンテナンスは避けます。
中央設定 (推奨)
以下をエクスポートする設定 (例: site-pages-config.ts) を作成します:
- セクション別 (ツール、ブログ、マーケティングなど) のページスラッグ/パス
- オプション: 正確な lastmod のためのページごとの
modifiedDate - 関数: サイトマップと IndexNow 用の
getAllPageUrls(baseUrl)
理由: サイトマップ、IndexNow、フィードがすべて同じ設定からインポートできます — URL の重複メンテナンスが不要です。IndexNow も同じ URL リストを使用する必要があります。別々にハードコードされたリストは避けてください。
7. robots.txt
robots.txt に以下を追加します:
Sitemap: https://example.com/sitemap.xml
複数のサイトマップがある場合、メインのインデックスのみを宣言します。
8. 出力形式
単一サイトマップの例
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/</loc>
<lastmod>2025-01-15</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://example.com/page</loc>
<lastmod>2025-01-10</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
サイトマップインデックスの例
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap/pages.xml</loc>
<lastmod>2025-01-15</lastmod>
</sitemap>
<sitemap>
<loc>https://example.com/sitemap/posts.xml</loc>
<lastmod>2025-01-14</lastmod>
</sitemap>
</sitemapindex>
9. 送信と検証
サイトマップを生成した後、ユーザーに送信手順を案内します:
- robots.txt:
Sitemap: https://example.com/sitemap.xml(またはインデックス URL) を追加します - Google Search Console: インデックス → サイトマップに移動し、サイトマップ URL を入力して送信します
- 検証: GSC のサイトマップレポートで「検出されたページ」数と予想を比較します。大きな差がある場合は調査します
- 監視: 24〜48 時間後、ステータスが「成功」と表示されることを確認します。インデックス → ページレポートをサイトマップでフィルタリングし、「インデックス登録済み」と「未登録」の内訳を確認します
注意すべき一般的な送信エラー:
- サイトマップ URL の 404 — ビルド出力とデプロイを確認してください
- 「取得できませんでした」 — robots.txt がサイトマップ URL をブロックしていないか確認してください
- 「HTML ページ」エラー — 後述の §10 HTML 診断を参照してください
10. HTML の診断(サイトマップが XML ではなく HTML を返す)
/sitemap.xml が HTTP 200 を返しても、Content-Type: text/html でホームページのコンテンツが含まれている場合、Google はサイトマップを黙って拒否します。ステータスコードが 200 のため、GSC に通知はありません。これは 404 よりも悪い状態です。
よくある原因:
- キャッチオールページルート(
pages/[...slug].vue、Next.js のキャッチオール)がサイトマップハンドラーより先にリクエストを処理している - i18n モジュールが routeRules/ミドルウェアより低いレベルで動作している
- 地域リダイレクトやリダイレクトプラグインがサイトマップのパスに一致している
- CDN/キャッシュレイヤーが Content-Type ヘッダーを削除している
次の方法で診断します:
curl -I https://example.com/sitemap.xml # Check Content-Type
curl -A "Googlebot" -I https://example.com/sitemap.xml # Googlebot's view
curl -s https://example.com/sitemap.xml | head -5 # First lines must be XML
修正方法(Next.js):server/routes/sitemap.xml.ts を使用します(優先度が最も高く、キャッチオールをバイパスします)。i18n では、excludePatterns: [/^\/sitemap.*\.xml$/] を追加します。サイトマップファイル名を変更すると(例:sitemap_index.xml)、失敗状態の Google キャッシュを回避できることがあります。
11. よくある問題
| 問題 | 原因/修正方法 |
|---|---|
| サイトマップが 404 を返す | ビルドの失敗、誤ったパス、誤ったエクスポート。ルートとデプロイを確認します |
| ページが不足している | URL がデータソースにない、フィルタリングされている、または除外されている |
| lastmod の異常 | new Date() は避け、ページメタデータの modifiedDate を使用します |
| Google にインデックス登録されない | GSC でサイトマップを送信し、カバレッジ(google-search-console)と robots を確認します |
| EN/ZH の URL が一致しない | 統一されたデータソースを使用し、ロケールごとに生成する際は同じリストを共有します |
| サイトマップが HTML を返す | キャッチオールルートまたは i18n がサイトマップハンドラーより先にリクエストを処理しています。curl -I と Googlebot UA で診断します。§10 を参照してください |
参考資料
関連スキル
- website-structure:ページ構造と URL リストを計画します。サイトマップには、計画されたインデックス登録可能なページが反映されます
- google-search-console:サイトマップのステータス、インデックス登録された URL 数、カバレッジ
- robots-txt:robots.txt でサイトマップを参照します
- indexnow:設定から同じ URL リストを共有します
- image-optimization:画像を見つけやすくするための画像サイトマップ拡張
- video-optimization:動画を見つけやすくするための動画サイトマップ拡張