hreflang で多言語・多地域を正しく出し分ける
hreflang は、同じ内容の言語別・地域別ページが複数あるとき、検索エンジンに「どれがどの言語・地域向けか」を伝え、利用者に合った版を検索結果に出し分けさせる仕組みです。書式は link rel=alternate、言語コードは ISO 639-1、地域は任意で ISO 3166-1 alpha-2 を使います。ポイントは相互参照が双方向で必須なこと、そして単一言語サイトには不要なことです。
hreflang とは何ですか?
hreflang は、同じ内容を持つ言語別・地域別ページの関係を検索エンジンに伝える指定です。たとえば日本語版と英語版が同じ内容なら、両者を hreflang で結び、利用者の言語や地域に合った版を検索結果に出し分けさせます。順位を上げる仕組みではなく、あくまで「適切な版を、適切な相手に見せる」ためのものだと理解するのが正確です。
多言語サイトでよくあるのは、日本語で検索した利用者に英語版が表示されてしまう、あるいはアメリカ在住の利用者に イギリス向けの価格ページが出てしまう、といったすれ違いです。hreflang は、同じ内容の各バージョンを検索エンジンに束ねて伝え、利用者の言語設定や所在地に応じて 最も適切な版を検索結果に出させるための指定です。
重要なのは、hreflang が順位を上げる仕組みではないことです。あくまで「どの版を誰に見せるか」を 最適化するだけで、コンテンツの評価そのものを底上げするものではありません。ここを誤解すると、SEO の裏技のように 期待して肩透かしを食らいます。
どんなときに必要ですか?
同じ内容を複数の言語・地域バージョンで提供しているサイトに必要です。日本語版と英語版、あるいは同じ英語でもアメリカ向けとイギリス向けで通貨や表記を分けている、といった場合が対象です。逆に、単一言語だけのサイトや言語別ページを持たないサイトには hreflang は不要で、無理に付けても効果はありません。
判断はシンプルです。同じ内容を、言語や地域で分けた複数の URL で提供しているか。 該当するなら hreflang の出番で、そうでなければ不要です。次の 2 つを混同しないでください。
- 言語で分ける — 日本語
jaと英語enのように、翻訳された別バージョンがある - 地域で分ける — 同じ英語でも、アメリカ向け
en-USとイギリス向けen-GBで 通貨・送料・表記を変えている
書式(コードの書き方)はどうなりますか?
各ページで link rel=alternate を並べ、hreflang 属性に言語コード、href に対応する URL を書きます。言語コードは ISO 639-1(ja・en など)、地域を分けたいときはハイフンでつないで ISO 3166-1 alpha-2(en-US・en-GB など)を足します。地域は任意で言語だけの指定も有効、zh-Hant のような表記スクリプト付きも使えます。
値は「言語コード」または「言語コード+地域コード」の形を取ります。言語は必須、地域は任意です。 言語だけを指定すればその言語圏全体に、地域まで指定すればその国・地域に、それぞれ届きます。コードの出典が 決まっている点に注意してください。
| 要素 | 出典 | 例 |
|---|---|---|
| 言語(必須) | ISO 639-1 | ja |
| 地域(任意) | ISO 3166-1 alpha-2 | US |
| 言語+地域 | ハイフンでつなぐ | en-US |
| 表記スクリプト付き | ISO 15924 を挟む | zh-Hant |
| 既定版 | 予約語 | x-default |
値の大文字・小文字は区別されませんが、慣例として言語は小文字、地域は大文字(en-US)で 書くと読みやすくなります。区切りは必ずハイフンで、アンダースコア(en_US)は誤りです。
<!-- 日本語版ページ https://example.com/ja/ の <head> -->
<!-- 全バージョン + 自己参照 + x-default を、すべて列挙する -->
<link rel="alternate" hreflang="ja" href="https://example.com/ja/">
<link rel="alternate" hreflang="en" href="https://example.com/en/">
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/">
<link rel="alternate" hreflang="x-default" href="https://example.com/">
<!-- ★ 英語版ページ https://example.com/en/ の <head> にも、
まったく同じ 4 本を書く。これが「相互参照」。片方だけだと無視される -->相互参照とは何で、なぜ必須ですか?
相互参照は双方向が必須です。ページ A が B を指すなら B も A を指し返す必要があり、片方向だけの指定は検索エンジンに無視されます。さらに各ページは自分自身への hreflang(自己参照)も含めます。つまり n 個の版があれば、各ページが自分を含む n 本の hreflang を持つのが正しい形で、1 か所でも欠けると全体が崩れます。
ここが hreflang で最もつまずくポイントです。「A が B を指すなら、B も A を指し返す」という 双方向のルールがあり、片方向の指定は検索エンジンに信用されず丸ごと無視されます。加えて、各ページは自分自身への hreflang(自己参照)も持たなければなりません。
| このページ | 書くべき hreflang(自己参照を含む) |
|---|---|
/ja/ | ja(自分)・en・en-US の 3 本 + x-default |
/en/ | ja・en(自分)・en-US の 3 本 + x-default |
/en-us/ | ja・en・en-US(自分)の 3 本 + x-default |
つまり n 個の版があれば、各ページが自分を含む n 本(+任意で x-default)を持つ、というのが 正しい形です。どれか 1 ページで 1 本でも欠けると、そのページと相手の関係が崩れ、出し分けが機能しなくなります。 版を追加するたびに、既存の全ページへ新しい版へのリンクを足す必要がある点も忘れないでください。
x-default は何のために使いますか?
x-default は、どの言語・地域にも一致しなかった利用者に見せる既定版を指定する値です。hreflang="x-default" として、言語選択ページやグローバル版の URL を指します。対応していない言語の利用者が来たときのフォールバック先になり、必須ではありませんが、想定外の相手への出し分けを明示できるため多言語サイトでは付けておくと安全です。
たとえば日本語版と英語版しか用意していないサイトに、フランス語で検索するフランスの利用者が来たとします。 どの hreflang にも一致しないため、検索エンジンは「どれを見せればいいか」を判断できません。 このとき x-default を指定しておくと、言語選択ページやグローバル版など、既定として見せたい URLにフォールバックさせられます。
実装方法にはどんな選択肢がありますか?
実装方法は 3 つあり、いずれか 1 つで構いません。HTML ページなら head 内に link rel=alternate を書く方法が最も一般的です。ページ数が多い場合はサイトマップに xhtml:link で記述すると管理しやすく、PDF など HTML でないファイルには HTTP レスポンスヘッダーで指定します。どの方法でも、相互参照と自己参照のルールは同じく守る必要があります。
3 つの方法があり、どれか 1 つを選べば十分です。同じページに複数の方法で二重に書く必要は ありません。サイトの構成に合わせて選びます。
| 方法 | 向いている場面 | 書く場所 |
|---|---|---|
head の link | 一般的な HTML ページ | 各ページの <head> |
| サイトマップ | ページ数が多い / head を触りにくい | XML サイトマップ |
| HTTP ヘッダー | PDF など HTML でないファイル | サーバのレスポンス |
<!-- XML サイトマップに書く場合。xhtml 名前空間を宣言し、
各 <url> に全バージョンの <xhtml:link> を並べる -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://example.com/ja/</loc>
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/"/>
</url>
</urlset># PDF など HTML でないファイルは、HTTP レスポンスヘッダーで指定する
Link: <https://example.com/doc.ja.pdf>; rel="alternate"; hreflang="ja",
<https://example.com/doc.en.pdf>; rel="alternate"; hreflang="en",
<https://example.com/doc.pdf>; rel="alternate"; hreflang="x-default"どの方法でも守るべきことは同じです。全バージョンを列挙し、自己参照を含め、相互参照を成立させる。 サイトマップ方式は 1 ファイルにまとめて管理でき、ページ側の head を汚さない利点があります。head 方式は ページ単位で完結する反面、版が増えるたびに全ページを編集する手間がかかります。
ありがちな誤りは何ですか?
最も多いのは片方向だけの指定と自己参照漏れで、どちらも指定全体が無視される原因になります。次が不正なコード(存在しない言語・国コードや、jp・en_US のような誤記)です。また hreflang と canonical が別々の URL を指して矛盾しているケースも典型で、canonical は各版で自分自身を指すのが原則。これらは一つでもあると出し分けが機能しません。
- 片方向だけ — A→B は書いたが B→A を書き忘れ。ペアが成立せず、その関係は無視される
- 自己参照漏れ — 自分自身への hreflang を書いていない。仕様上必要で、抜けると崩れる
- 不正なコード — 下の表のような誤記。存在しないコードは黙って無視される
- canonical との矛盾 — 各言語版の canonical が別言語の URL を指していると、hreflang と 衝突して意図しない版が選ばれる
| 伝えたい対象 | 誤り | 正しい |
|---|---|---|
| 日本語 | jp | ja |
| アメリカ英語 | en_US | en-US |
| イギリス | en-UK | en-GB |
| 中国語(繁体字) | chinese | zh-Hant |
正しく設定できたか、どう確認しますか?
まず各ページの head や HTTP ヘッダーを開き、全バージョンぶんの link と自己参照が揃っているかを目視します。Google Search Console のインターナショナルターゲティングや hreflang チェッカーを使うと、片方向・コード誤り・自己参照漏れを機械的に検出できます。相互参照は 1 か所でも欠けると崩れるため、版を増やすたびに全ページを確認します。
確認の勘所は「対称性」です。全バージョンをリストアップし、各ページがそのリスト全員(自分を含む)を 指しているかを突き合わせます。機械的にやるなら次の順が効率的です。
- 自己参照の有無 — 各ページが自分自身への hreflang を持っているか
- 双方向性 — A が指す相手が、必ず A を指し返しているか
- コードの妥当性 —
jpやen_USのような誤記が混ざっていないか - canonical との整合 — 各版の canonical が自分自身を指しているか
Google Search Console のインターナショナルターゲティングや、公開されている hreflang チェッカーを使えば、 これらの多くは自動で洗い出せます。ただし「そもそもどの版とどの版が同じ内容か」という設計判断は 人にしか下せません。ツールは対称性の崩れを教えてくれますが、束ねる相手が正しいかまでは保証しません。