hreflangが効かない原因—自己参照と返りリンクの3要件で点検する
日本語ページの head に hreflang="en" で英語版を指定した。書式も確認した。なのに、日本語で検索したユーザーに英語ページが出続けたり、多言語チェックツールでエラーが消えなかったりする——。このとき、タグの書式より先に疑いたいのが**「自己参照」と「返りリンク」の欠落**です。Googleの公式ドキュメントが「よくある間違い」の筆頭に挙げているのが、まさに返りリンクの欠落だからです。
hreflang(エイチレフラング。そのページがどの言語・地域向けかを検索エンジンに伝えるための記述)は、1ページに1行書いて終わりの仕組みではありません。公式ガイドラインは、対象になる全言語のページがお互いを指し合い、かつ自分自身も列挙することを要件にしています。片方向だけの指定は、この要件を満たしません。
点検すべき要件は3つに整理できます。自己参照・返りリンク・完全修飾URL。順に確かめたうえで、日本語・英語の2言語サイトを例に、欠落を見つけて直すまでの5ステップを通してみましょう。
返りリンクの欠落は「よくある間違い」の筆頭
Googleの公式ドキュメントは、hreflangでよくある間違いの筆頭に「返りリンクの欠落(Missing return links)」を挙げています。ページXがページYにリンクしたら、ページYからページXへもリンクし返さなければならない、と明記されています。しかも公式ドキュメントは、この双方向の関係を「hreflangを使うすべてのページ」で成立させることを求めています。1ペアでも例外を作らない、ということです。
つまり、日本語ページに「英語版はこちら」と書くだけでは足りません。英語ページ側にも「日本語版はこちら」が要ります。
公式ヘルプには具体例もあります。https://de.example.com/index.html(ドイツ語版)に英語版へのリンクを書いたら、英語版の https://en-gb.example.com/index.html 側にも、ドイツ語版を指し返す hreflang="de" のリンクが必要です。
さらに、各言語版は他の全言語版に加えて自分自身も列挙する必要があります。これが自己参照です。日本語ページの head には、英語版への行だけでなく、hreflang="ja" で自分自身を指す行も並べます。「自分のページに自分のURLを書くのは冗長では」と感じるかもしれませんが、公式ガイドラインが全実装方式に共通の要件として定めているものです。
記述の3要件
公式ドキュメントの要件を、点検しやすい形に3つへ整理します。
| 要件 | 内容 | 欠けているときの典型症状 |
|---|---|---|
| 自己参照 | 各言語ページが、自分自身のURLと言語コードも列挙する | 全方式共通の公式ガイドラインの要件を満たさない |
| 返りリンク | AがBを指したら、BもAを指し返す。全ペアで双方向に | 公式が「よくある間違い」の筆頭に挙げる状態そのもの |
| 完全修飾URL | https:// から始まる完全なURLで書く | //example.com/foo や /foo は要件を満たさない書き方になる |
1つめと2つめは、前の節で見たとおりです。3つめの完全修飾URLは見落とされがちですが、公式ヘルプは「代替URLは転送方式(http/https)を含む完全修飾でなければならない」とし、//example.com/foo や /foo のような書き方はだめだと例まで挙げています。テンプレートで相対パスを出力しているサイトは、まずここを疑ってください。
なお、hreflangの言語コードはGoogleへの「申告」であって、ページ言語の判定そのものは別です。公式ヘルプは、言語の判定にはアルゴリズムを使うとしています。だから、コードだけ en にして中身が日本語のままのページを用意しても、狙った言語のページとして判定される保証はありません。この点は後半のエッジケースにつながります。
実装場所は3つある——ただし点検しやすい形に揃える
公式ドキュメントによると、hreflangの実装方法はHTMLの <link> タグ・HTTPヘッダー・XMLサイトマップの3通りです。XMLサイトマップの場合は、公式ドキュメントの例のように xhtml:link 要素で書きます。
<url>
<loc>https://www.example.com/english/page.html</loc>
<xhtml:link rel="alternate" hreflang="de"
href="https://www.example.de/deutsch/page.html"/>
<xhtml:link rel="alternate" hreflang="de-ch"
href="https://www.example.de/schweiz-deutsch/page.html"/>
</url>
どの方式でも3要件は同じです。実務の観点では、複数の方式に分散させると「HTMLでは書いたがサイトマップの記述が古いまま」といった不整合の温床になりやすいので、1つの方式に寄せて管理することをおすすめします(これは点検コストを下げるための運用上の工夫で、方式自体の優劣ではありません)。
ワークスルー: 日英2言語サイトを5ステップで点検する
架空のモデルケースで1回通します。https://example.com/ja/pricing.html(日本語)と https://example.com/en/pricing.html(英語)の料金ページペアです。手順は次の5ステップです。
- 対象ペアを洗い出す。 多言語化しているURLの対応表を作ります。今回は料金ページ1ペアだけですが、実サイトではテンプレート単位(トップ・製品・記事など)で洗い出します。
- 各URLから hreflang 行を抽出する。 ブラウザでページを開き、ソース表示(右クリック→「ページのソースを表示」)で
hreflangを検索します。サイトマップ実装なら該当<url>ブロックを見ます。 - マトリクス表に転記する。 行=記述があるページ、列=指定先の言語で表を作り、見つかった行を機械的に埋めます。
- 3要件で突き合わせる。 対角線(自己参照)が埋まっているか、表が対称(双方向)になっているか、各セルのURLが
https://から始まっているかを見ます。 - 欠落を修正し、全ページが同じセットを持つ状態にする。 直したら手順2〜4をもう一度回して、表が完全に埋まることを確認します。
手順3の表は、たとえばこうなります。
| 記述があるページ | ja 指定 | en 指定 | x-default 指定 |
|---|---|---|---|
| /ja/pricing.html | あり(自己参照) | あり | あり |
| /en/pricing.html | なし ← 欠落 | あり(自己参照) | あり |
この例では、英語ページに日本語版への返りリンクがありません。日本語ページから見ると「英語版を指したのに、指し返されていない」状態で、返りリンクの要件を満たしていません。修正は、英語ページ側に <link rel="alternate" hreflang="ja" href="https://example.com/ja/pricing.html" /> を1行足すだけです。
2言語ならこの表は2×3で済みます。ただし言語数が増えると、セル数は言語数の2乗で増えます。5言語なら各ページに6行(5言語+x-default)、サイト全体では抜けの起きる場所が一気に増えるので、表計算ソフトでのマトリクス管理か、機械的なチェックが現実的です。WemiroのようなSEO監査ツールでサイトを巡回させ、自己参照や返りリンクが欠けたURLの一覧を出す方法もあります。
x-default はどこを指すか
さきほどの表の3列めに出てきた x-default は、列挙したどの言語・地域にも合致しないユーザーに見せるページの指定です。公式ドキュメントの例では、米国・英国・一般英語話者・ドイツ語話者をそれぞれのローカライズ版に振り分け、それ以外のすべてのユーザーを汎用ホームページへ振り分ける構成が示されています。Google検索は、ユーザーのブラウザ設定に応じて適切な結果を返します。公式のコード例には、言語選択ページ(country-selector)を x-default に指定する形も登場します。
日英2言語のサイトなら、言語選択ページがなければ、主要な市場側(多くは日本語トップ)を x-default にする判断で問題ありません。大事なのは、これも各ページのセットに含め、全ページで同じ指定に揃えることです。
エッジケース: 翻訳が済んでいないページは「重複」と判定され得る
3要件をすべて満たしても、うまくいかないケースが残っています。翻訳が途中のページです。
Googleの正規化(重複するURL群から代表URLを1つ選ぶ処理)のドキュメントには、こうあります。1つのページの言語違いバージョンは、主要コンテンツが同じ言語のままである場合に限り重複と見なされる——つまり、ヘッダーとフッターだけ英語にして本文が日本語のままの「英語版」は、日本語版の重複として扱われ得るということです。そして公式ドキュメントは、正規化を「重複するコンテンツのうち1つの版だけを検索結果に表示するのに役立つ処理」だと説明しています。未翻訳の「英語版」が日本語版の重複側に回れば、hreflangで指した英語版が検索結果に出てこない、という症状につながることがあります。
あわてる必要はありません。サイト内にある程度の重複コンテンツがあること自体は正常で、Googleのスパムポリシー違反にはならないと公式ドキュメントは明記しています。ペナルティの心配ではなく、「未翻訳ページをhreflangのセットに入れるのが早すぎた」という順序の問題です。本文の翻訳が済むまで、そのページはセットから外しておくのが安全です。
canonical(カノニカル。重複するページ群の中でGoogleに優先させたい正規URLの指定)との関係にも注意してください。canonicalの指定はルールではなくヒントであり、Googleがサイト側の指定と別のページを正規に選ぶことがある、と公式ドキュメントは述べています。hreflangで並べた各言語ページが、それぞれ自分自身を正規URLとして扱える状態(別URLへ統合されていない状態)になっているかは、URL検査などで個別に確かめる価値があります。正規化の仕組みそのものは重複コンテンツとcanonicalの整理で詳しく扱っています。
公開前の自己点検チェックリスト
最後に、ここまでの内容をその場で当てはめられる形にまとめます。
- 各言語ページに、自分自身を指す hreflang 行(自己参照)があるか
- セット内の全ページが、お互いを双方向に指し合っているか(マトリクス表が対称か)
- すべてのURLが
https://から始まる完全修飾で書かれているか - 実装方式(HTML・HTTPヘッダー・サイトマップ)が1つに揃っていて、古い記述が別の場所に残っていないか
x-defaultを全ページで同じ指定に揃えているか- 本文まで翻訳が済んでいないページをセットに入れていないか
表が対称に埋まり、このリストが全部通れば、hreflangの設定としてやるべきことは揃っています。あとは再クロールを待って、検索結果での言語の出し分けが意図どおりになっているかを確かめていきましょう。
出典
