はじめに
sitemap.xmlは、検索エンジンに「このサイトにはこんなページがありますよ」と一覧を渡すための地図のようなものです。
商品が数千から数万SKUあるECで、これを手動で管理するのは現実的ではないですよね。
この記事では、モーターサイクル用品を扱うヘッドレスECで、商品やカテゴリの増減に自動で追従するsitemap.xmlとrobots.txtをどう生成し、生成コストをキャッシュでどう抑えたのかを解説します。あわせて、重複URLを防ぐEdgeミドルウェアでのURL正規化にも触れます。
sitemapとrobotsを動的に生成する
なぜ動的生成が必要か
商品は日々追加され、売り切れて消えていきます。静的なsitemapを一度作って置いておくだけでは、新商品がいつまでもインデックスされなかったり、消えた商品のURLが残り続けたりします。ヘッドレスではテーマが自動更新してくれていたこの仕組みが消えるので、自前で用意する必要があります。
そこで、リクエストのたびに現在の商品・カテゴリ一覧からsitemap.xmlを組み立てる動的生成にしました。robots.txtも同様に動的に返し、クロールしてほしいURLと、してほしくないURLを制御します。
検索エンジンが sitemap.xml をリクエスト
生成済みキャッシュがあればそれを返す
キャッシュがなければ最新の一覧を取得
sitemap.xmlを組み立て、結果をキャッシュに保存
noindexで見せたくないページを制御
すべてのページをインデックスさせたいわけではありません。たとえば販売チャネル外の商品や、検索に出したくないページはnoindexを指定して除外します。sitemapに載せるのは「検索に出したいURL」だけに絞り、robots.txtやmetaのnoindexで見せたくないものを抑える。この二段構えで、クロールの無駄を減らしています。
生成コストをキャッシュで抑える
毎回フル生成は重い
数万SKUの一覧を毎リクエストで取得してXMLに組み立てるのは、それなりに重い処理です。クローラーが頻繁にアクセスするたびにフル生成していては、サーバーにもデータソースにも負荷がかかります。
そこで、生成したsitemapの結果をキャッシュし、一定期間は同じ内容を返すようにしました。商品の増減はキャッシュの有効期限が切れたタイミングで反映されるので、鮮度と負荷のバランスを取っています。
毎リクエストで数万件を取得・生成。負荷が高い
有効期限内は生成済みを再利用。負荷を大幅に削減
統計APIで監視する
自動生成に任せきりにすると、「気づいたらsitemapのURLが激減していた」といった事故に気づけません。そこで、sitemap内のURL数などを返す統計APIを用意し、生成結果を監視できるようにしました。URL数が急に変動したら、データ取得の失敗や設定ミスを疑うサインになります。
監視で「静かな事故」を防ぐ
sitemapの不具合は、検索順位がじわじわ下がる形で現れることが多く、すぐには気づきにくいものです。URL数を定期的に確認できる仕組みを持っておくと、異常を早期に検知できて安心です。
URL正規化で評価の分散を防ぐ
重複URLはなぜ問題か
同じ商品でも、URLに大文字が混ざっていたり、トラッキング用のクエリパラメータが付いていたりすると、検索エンジンは別々のURLとして扱うことがあります。すると本来1ページに集まるべきSEO評価が複数のURLに分散し、どれも中途半端な評価になってしまうんです。
Edgeミドルウェアで301統一
これを防ぐため、Edgeミドルウェアで正規化を行っています。大文字混在のURLは小文字に、不要なクエリパラメータは除去した上で、正規のURLへ301リダイレクトします。301は「恒久的に移動した」という意味なので、評価も正規URLへ引き継がれます。
Edgeで処理するので、アプリ本体に到達する前に軽量に正規化でき、全ページに一貫して効かせられます。
まとめ
動的sitemapとrobotsは、商品の増減に自動で追従しながら、キャッシュで生成コストを抑えるのが要点です。統計APIでURL数を監視し、静かに進行する事故を防ぐ。さらにEdgeミドルウェアでURLを正規化し、重複による評価の分散を防ぐことで、検索エンジンから見たサイトの一貫性を保っています。
ここまでの「SSR可視化」「構造化データ」「動的sitemap・正規化」が揃うと、ヘッドレスでも失われがちなSEOを取り戻せます。全体像は「ヘッドレスECのSEO設計」にまとめているので、そちらもぜひご覧ください。