seo/hreflang · hreflang の妥当性
hreflang の alternate には有効なコードを使いましょう。x-default はセレクター・リダイレクトページで推奨されます。
重大度: warning
チェック内容
<link rel="alternate" hreflang="…"> の alternate を検証します。本ルールはオプトインで、hreflang alternate のないページは検出しません。alternate が存在する場合、次を検出します。
- 不正な
hreflang値(x-defaultでも、en、en-US、zh-Hant、es-419のような言語(-スクリプト)(-地域)形式のコードでもないもの) - alternate が 2 つ以上あるのに
x-defaultが宣言されていない場合
なぜ重要か
hreflang コードが不正だと国際ターゲティングが機能せず、検索エンジンが誤った言語版を表示したり、アノテーション自体を無視したりします。
一方、x-default の欠如は性質が異なります。Google 自身のガイダンスは「特に言語・国選択ページや自動リダイレクトするホームページでは、一致する言語がなかったユーザー向けのフォールバックページの追加を検討してください」と述べており、これは特定の形のページに向けた推奨であって、多言語サイト全般に対する欠陥ではありません。言語セレクターも自動リダイレクトも持たず、固定の言語 alternate 一覧だけを提示するページには、フォールバック先が必要な「一致しない言語のユーザー」自体が存在しないため、そこで x-default を省略するのは見落としではなく妥当な選択です。
修正方法
<svelte:head>
<link rel="alternate" hreflang="en" href="https://example.com/en/" />
<link rel="alternate" hreflang="de" href="https://example.com/de/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />
</svelte:head>
制限事項
検証対象は BCP-47 の実用的なサブセット(言語・任意のスクリプト・任意の地域)のみで、文法全体はカバーしません。BCP-47 のバリアントや拡張(例: de-DE-1996、en-US-u-hc-h12)は有効な hreflang 値ですが、本ルールでは認識されず不正な値として検出されます。
モードによる違い
ソース解析(CLI、ダッシュボードの静的ベースライン)は、各ルートの <head> を、ページとレイアウトチェーンの <svelte:head> からリポジトリ内のコンポーネントもたどって合成し、既知のメタコンポーネント(svelte-meta-tags、svelte-seo)と metaComponents で宣言したものも加えます。判定するのはリテラルな値だけで、動的な値は検査しません。レンダリング解析(Vite プラグインのビルド、ダッシュボードで訪問したルート)は出荷される <head> を読み、値はすべてリテラルです。ビルドが対象にするのはプリレンダリングされたルートだけです。両者が食い違うときは、レンダリング解析の結果を信じてください。
無効化
既存の検出は suppressions ファイルに記録して抑制できます(npx svelte-vitals --update-suppressions)。overrides でルートやパス単位に絞るか、ルールごと無効化するには、次のように設定します。
export default {
rules: {
'seo/hreflang': 'off'
}
};