静的サイトのcanonical自己参照とhreflang相互性をPythonで機械検査する
ページ数の多い静的サイトを日英ミラーで運用していると、canonical が別ページを指していたり、hreflang の対応先が片方向だけだったりする崩れが、レビューをすり抜けて本番に出てしまう。こうした崩れは Google の重複判定やインデックス漏れの原因になる。
自分が運用している「ハシトシステム」(hashitosystem.com)は、日本語ページと /en/ 配下の英語ミラーを持つ 200 ページ超の静的サイトだ。ここでは、デプロイ前に必ず通すオンページSEOの機械検査を、依存ゼロの Python で最小構成に落として手元で動かす。
何を検査すべきか
重複・正規化まわりで壊れやすいのは次の4点だ。
- indexable なページの
canonicalが自己参照になっているか(別URLを指していないか・欠落していないか) canonical/title/meta descriptionが indexable 間で重複していないかhreflangの ja / en が相互に一致しているか(対応ページが片方向で欠けていないか)- indexable なのに hreflang を持たない「孤立ページ」がないか(作業用・デモは
noindexにして除外する)
ポイントは、<meta name="robots" content="noindex"> のページは監査対象から外すこと。意図的に検索対象外にしたページまで「hreflang が無い」と怒られては運用が回らない。
最小の監査スクリプト
public/ 配下の HTML を走査し、上記を検査する最小版が以下だ。正規表現で必要なタグだけ拾う。
1 | |
手元で試すには、public/ に日英2ページを置いて走らせる。
1 | |
英語版の canonical が自己参照(/en/tools/demo/)でないため、canonical-not-self として検出される。正しく /en/tools/demo/ に直すと、indexable pages checked: 2 と OK になる。
運用に組み込む
この検査をデプロイ前の必須ゲートにすると、崩れが本番に出なくなる。実運用では、
title/descriptionはページ固有にして重複ゼロを保つhreflangは ja / en / x-default を必ず相互に張り、x-default は ja に合わせる- 検索に載せたくない作業用ページは
noindex, followを付けて sitemap からも外す
というルールをスクリプトで機械的に守らせる。手作業のチェックリストは必ず抜けるので、「OK が出るまでデプロイしない」という一点に集約するのがコツだ。
実際にこの監査を通して運用しているツール群は hashitosystem.com で公開している。QRコード生成やダミーデータ生成など単機能ツールを日英ミラーで並べており、各ページの canonical / hreflang はこの検査を通したうえで配信している。