多言語SEOを壊すhreflangの間違い10選
壊れたhreflang設定のほぼすべては、この10の間違いで説明がつきます。しかもその多くは何のエラーも出しません。見つけ方と直し方を1つずつ解説します。
hreflangの問題のほとんどは、10の間違いに集約されます。リターンリンクの欠落、自己参照の不在、無効な言語コードや地域コード、相対URL、正規URLでないページの指定、x-defaultの欠落、実装方法の混在、部分的なカバレッジ、ブロックされた代替ページ、そしてhreflangを重複コンテンツの解決策と考えること。それぞれに明確な症状と、具体的な直し方があります。
hreflangが実際にしていること
hreflangは、あるユーザーにどの言語版・地域版のページを見せるかを検索エンジンに伝えます。検索結果に出るURLを差し替える、ただそれだけです。ランキングを押し上げるものではありません。注釈が完璧なページでも、順位は自力で獲得しなければなりません。
正しいhreflangのセットとは
英語版、スペイン語版、そしてフォールバックという3つのバージョンを、その3ページすべてのhead内にlink要素として書いた例です。
<link rel="alternate" hreflang="en" href="https://example.com/page/">
<link rel="alternate" hreflang="es" href="https://example.com/es/pagina/">
<link rel="alternate" hreflang="x-default" href="https://example.com/page/">
同じ関係をXMLサイトマップで表現した例です。urlsetでxhtml名前空間を宣言する必要があります。
<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="es" href="https://example.com/es/pagina/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page/"/>
</url>
</urlset>
スペイン語版のページも、まったく同じセットを持ちます。この対称性こそが仕組みのすべてであり、以下に挙げる間違いのほとんどは、その対称性を壊す方法にほかなりません。
1. リターンリンクの欠落
hreflangの関係は必ず双方向です。AがBを指すなら、BもAを指し返さなければならず、そうでなければ注釈は未確認として無視されます。症状:検索結果でバージョンが入れ替わらず、Search Consoleがリターンタグなしと報告する。直し方:一方通行のリストではなく、グループ内のすべてのページに同じ完全なセットを出力します。
2. 自己参照のhreflangがない
各ページは、自分自身のURLに対するhreflangエントリーを含めなければなりません。これを省くとセットが不完全になり、検索エンジンは整合の取れないセットを破棄します。直し方:自己参照を追加し、3言語のグループなら3ページすべてに3件のエントリーを持たせます。
3. 言語コードと地域コードの誤り
言語の値はISO 639-1のコードで、任意指定の地域はISO 3166-1 Alpha 2でなければなりません。地域だけを単独で使うことはできません。典型的な誤りが3つあります。en-GBとすべきところをen-UKと書く、zh-CN(中国での中国語)とzh-Hans(地域ではなく用字系のサブタグ)を混同する、そして英国のつもりでuk(実際はウクライナ語)を使うように、国名から言語を作り出す。無効な値は警告もなく破棄されます。
4. 相対URL
hreflangの値は、プロトコルを含む完全な絶対URLでなければなりません。/es/pagina/のような値は無効で、そのエントリーは読み飛ばされます。症状:テンプレート上は正しく見えるのに、どこにも登録されない注釈。直し方:毎回https://example.com/es/pagina/の形で書き出します。サイトマップのloc値と同じルールです。
5. 正規URLでない、リダイレクトする、noindexのURLを指す
hreflangとcanonicalは一致していなければなりません。各ページのcanonicalは自分自身を指し、hreflangの各値は別バージョンのcanonical URLを指します。リダイレクトするURL、別ページへ正規化されるURL、noindexのURLに注釈を付けると矛盾した指示になり、その衝突はたいてい、あなたの注釈が破棄される形で決着します。直し方:グループ内の各URLが200を返し、インデックス可能で、自分自身をcanonicalにしていることを確認します。
6. x-defaultの欠落と誤用
x-defaultは、カバーしていない言語のユーザー向けのフォールバックを示します。言語セレクター、グローバルのランディングページ、あるいは主要バージョンなどです。症状:対象外のロケールからの訪問者が、なりゆき任せのバージョンに着地する。直し方:本当のフォールバックを1つ決め、グループ全体で同じものを繰り返します。
7. 実装方法の混在
hreflangを書ける正しい場所は3つあります。head内のHTMLのlink要素、HTTPのLinkヘッダー、そしてXMLサイトマップ内のxhtml:link注釈です。どれか1つで機能します。問題が起きるのは、2つを中途半端に実装したときです。headには2言語しか並んでいないのに、サイトマップには4言語がある、といった状態になります。方法を1つ選び、その中で完全にしてください。
8. トップページだけに注釈を付ける
hreflangはページ単位のシグナルであり、サイト単位の設定ではありません。トップページにタグを付けても、その下にある500の商品ページには何の効果もありません。症状:市場ごとに正しいトップページは出るのに、その先のページは誤った言語のまま。直し方:すべてのページを本当の対応ページと組み合わせ、対応ページが存在しない言語は、近いものを指すのではなくセットから外します。
9. 代替ページをブロックしてクロールできなくする
関係が確認されるのは、両方のページを取得できる場合だけです。robots.txtで言語フォルダーをDisallowしたり、クローラーを弾くジオリダイレクトの背後に置いたりすると、リターンリンクの確認が成立しません。直し方:注釈を付けたすべてのURLを、リダイレクトなしでクロールでき到達できる状態に保ちます。
10. hreflangが重複コンテンツを解決すると期待する
hreflangが扱うのは地域と言語のバリエーションです。ほぼ同一のページを重複排除するものではなく、canonicalタグの代わりにもなりません。米国向けとオーストラリア向けのように、ほとんど同じ英語のページが2つあれば、両者は依然として互いに競合します。hreflangはそれぞれがどの市場向けかを述べるだけです。本物の重複には、正規化か統合が必要です。
どの実装方法を選ぶか
| 方法 | 向いているケース | 主な欠点 |
|---|---|---|
| head内のHTMLのlink要素 | HTMLページ、言語数が少ないサイト、テンプレート駆動のサイト | マークアップが言語数の2乗で増え、ページを読み込むたびに送られる |
| HTTPのLinkヘッダー | PDFなど、編集できるheadがない非HTMLファイル | ソース表示では見えず、サーバーやCDNの設定が必要で、移転の際に失われやすい |
| XMLサイトマップのxhtml:link | 大規模サイトや言語数の多いサイト。ページのマークアップを軽く保てる | 目視での確認が難しく、サイトマップが有効かつ最新でないとセット全体が古くなる |
サイトマップ方式は最もスケールしますが、だからこそ静かに壊れます。名前空間の書き損じや古いままのファイルが、注釈もろとも道連れにするからです。ジェネレーターを変更したらサイトマップを検証し、大規模な多言語のセットはサイトマップインデックスで分割してください。
hreflangが機能しているか確かめる方法
双方向で確認します。ページAを取得して注釈のセットを読み、次にそこに書かれたすべてのURLを取得して、各ページが自分自身を含む同じセットを列挙しているかを確かめます。HTMLの方法はソース表示で、2つ目はレスポンスヘッダーで、3つ目はサイトマップで確認できます。非対称な箇所があれば、それがバグです。
プロパティで多言語ターゲティングのレポートが提供されている場合、Search Consoleはリターンタグの欠落や不明な言語コードといったhreflangのエラーを一覧してくれます。大規模に問題を把握するには最も早い方法です。デプロイからは遅れて反映されるため、あくまでセカンドオピニオンとして扱ってください。その下にあるクロール層の不具合については、サイトマップのエラーガイドが、注釈のセットを壊すリダイレクト、404、robots.txtによるブロックを扱っています。