SEO
XMLサイトマップの問題を診断する方法:手順を追って解説
サイトマップは、インデックスしてほしいページだけを載せた整ったリストであるべきです。自分のサイトマップが読み込めて解析でき、公開中でインデックス可能なURLだけを載せているかを確認する方法と、そうでないときの直し方を紹介します。
このページの内容
XMLサイトマップは、検索エンジンにクロールとインデックスをしてほしいURLの一覧です。インデックスを保証するものではありませんが、整ったサイトマップは検索エンジンが新しいページや更新されたページを見つける助けになります。逆に乱雑なサイトマップは、リダイレクト、エラー、インデックスしないよう指示したページに検索エンジンの注意を浪費させます。このファイル自体になじみがない方は、まずrobots.txtとsitemap.xmlの解説からお読みください。
サイトマップの問題は、2つのグループに分けられます。ファイルそのものの問題(見つけられて、読み取れるか)と、中身の問題(載っているURLは載せる価値があるか)です。この順番で確認していきます。
パート1:サイトマップは見つけられ、読み取れるか
検索エンジンが探す場所にありますか?
置き場所に決まった指定はないので、見つけてもらえるようにしておきます。robots.txtに絶対URLで Sitemap: https://example.com/sitemap.xml の行を追加し、Google Search ConsoleとBing Webmaster Toolsでサイトマップを送信してください。多くのプラットフォームは、/sitemap.xml、/sitemap_index.xml、/wp-sitemap.xml のいずれかにサイトマップを生成します。
XMLとともに200を返していますか?
サイトマップのURLをブラウザで開き、開発者ツールでステータスを確認します。よくある失敗は、プラグインを変更したあとの404、トップページへのリダイレクト、ログインページ、そして「ソフト」エラー、つまり実際にはHTMLのエラーページなのに200で返されるレスポンスです。レスポンスはXML(application/xml または text/xml)であるべきで、.xml.gz ファイルの場合はgzip圧縮されたXMLになります。
正しく解析できますか?
ルート要素は <urlset>(ページの一覧)または <sitemapindex>(ほかのサイトマップの一覧)でなければなりません。原因としてよくあるのは、<?xml 宣言の前に紛れ込んだ空白やPHPの警告、URL内のエスケープされていない & 文字(& と書く必要があります)、タイムアウトで途中までしか出力されなかった内容です。ブラウザに「XML パースエラー」と表示されるなら、それがまさに調べるべき場所を教えてくれています。
上限に収まっていますか?
1つのサイトマップファイルに含められるのは、最大50,000件のURL、非圧縮で50 MBまでです。それより大きなサイトでは、URLを複数のファイルに分け、サイトマップインデックスにそれらを列挙します。インデックスに記載したすべての子サイトマップも、きちんと読み込めることを確認してください。
パート2:正しいURLが載っているか
サイトマップ内のすべてのURLは、200を返すページの、最終的で正規の、インデックス可能なアドレスであるべきです。それ以外のものは、矛盾したメッセージを送ることになります。次のものがないか探してください。
- 404、410、5xxを返すURL。 静的なサイトマップに残ったままの削除済みページや、在庫切れになって削除された商品などです。
- リダイレクトされるURL。 サイト移転後の古い形式のURLや、
http://版、wwwなし版であることがよくあります。代わりに転送先を載せてください。 - noindexのページ。 ページを一覧に載せながら、検索エンジンにインデックスしないよう伝えるのは矛盾しています。noindexの意味を参照してください。
- 正規でないURL。 パラメータ付きのバージョンや、canonicalが別の場所を指している重複ページです。詳しくはcanonicalの問題を修正する方法をご覧ください。
- ほかのホスト。 クロスサイト送信の確認が済んでいないかぎり、サイトマップに載せられるのは自身のホスト上のURLだけです。ステージング環境やCDNのホスト名が紛れ込むのは、典型的なパターンです。
- 重複。 同じURLが2回載っているケースで、末尾のスラッシュありとなしで重複していることがよくあります。
- robots.txtでブロックされているURL。 検索エンジンはDisallowされたものをクロールできないので、載せても意味がありません。
lastmodの日付
<lastmod> には、2026-09-24 や 2026-09-24T10:30:00+00:00 のようなW3C Datetime形式を使い、ページに意味のある変更が最後に加えられた日時を反映させます。Googleは、lastmod が一貫して正確な場合にはこれを利用し、priority と changefreq は無視すると述べています。ビルドのたびにすべてのURLに今日の日付を入れるサイトマップは、この項目を無視するよう検索エンジンに教えているようなものです。
robots.txtとサイトマップをチェック
Rudraの無料SEOチェッカーは、robots.txtとそこで宣言されたサイトマップを取得し、読み込めて解析できるか、テストしたページが載っているか、有効なlastmodの日付が入っているかを報告します。
Rudraで確認する方法
単一ページのSEOチェッカー
Rudraの無料SEOチェッカーは、robots.txtと、そこで宣言されているサイトマップを読み取ります(最大3つまで。サイトマップインデックスの場合は、最初のいくつかの子サイトマップまでたどります)。宣言がない場合は、一般的な場所を代わりに探します。取得できないサイトマップ、解析できないサイトマップ、テストしたページが載っていないサイトマップ、lastmod の日付がないサイトマップを報告するほか、URLの重複、ほかのホストのURL、有効な日付になっていない lastmod の値については参考情報として知らせます。さらに、robots.txtの構文の問題や、サイト全体をブロックしているルールも検出します。
サイトスキャン
載っているURLが実際に機能しているかどうかは、アクセスしてみなければわかりません。Rudraのサイトスキャン(無料アカウントで、ダッシュボードから開始します)は、サイトマップ内のURLを記録し、クロールで各アドレスから得られた結果と照合します。対象は、4xxや5xxを返したサイトマップのURL、noindex が指定されたURL、リダイレクトされたURL、ほかのホストのURLです。プランのページ数上限やrobotsのルールのためにクロールが到達しなかったURLは、問題ありとは報告されず、「未クロール」として集計されます。そのため、大きなサイトマップに対して小規模なクロールを行うと「未クロール」が多数表示されますが、これは想定どおりの結果です。
Search Console
「サイトマップ」レポートでは、Googleが各ファイルを読み取れたかどうかと、検出されたURLの数がわかります。「ページのインデックス登録」レポートをサイトマップで絞り込むと、載っているURLのうちどれがインデックスされていないのか、その理由は何かを確認できます。
よくある原因を修正する
- サイトマップはCMSやフレームワークで生成する。 手作業ではなく自動生成にすれば、削除されたページや非公開にしたページが自動的に外れます。
- noindexのページ、リダイレクトされるページ、canonicalで別のURLに正規化されているページを除外する。 SEOプラグインやサイトマップ生成ツールの設定で行います。
- 優先するURLの形式をあらゆる場所で使う — プロトコル、ホスト、末尾のスラッシュをそろえ、サイトマップ、canonical、内部リンクが一致するようにします。
- lastmodを更新するのは、コンテンツが変わったときだけにする。
- 大きな変更のあとは再送信する。 サイト移転などのあとは、「サイトマップ」レポートで読み取りエラーが出ていないかを見守ります。
よくある質問
サイトマップは必要ですか?
小規模で内部リンクが整っているサイトなら、なくても問題なくクロールされます。サイトマップが最も役立つのは、大規模なサイト、被リンクの少ない新しいサイト、ページの追加や更新が頻繁なサイトです。
サイトマップにページを載せれば、インデックスされますか?
いいえ。サイトマップは検索エンジンがURLを発見する助けになるものです。ページがインデックスされるかどうかは、その品質、重複の有無、そしてnoindexやcanonicalタグといったシグナルによって決まります。
画像やPDFもサイトマップに載せるべきですか?
載せることはできますし、画像サイトマップの拡張機能もあります。ただし優先すべきなのは、重要なHTMLページがすべて正規URLで載っていることです。
サイトスキャンで、サイトマップのURLの多くが「未クロール」と表示されるのはなぜですか?
クロールはプランのページ数上限で止まり、robots.txtにも従うため、サイトマップに載っているすべてのURLには到達しない場合があります。それらのURLは問題ありと見なされているわけではなく、単にそのクロールでは検証されなかっただけです。