hreflangとは?12言語の実例と、よくある5つのミス

SEOgrinder 編集部 · 公開日 · 更新日 · 読了時間 約14分

結論: hreflang とは、どのページが同じ内容の言語別・地域別バージョンなのかを Google に伝える指定です。検索結果で、ユーザーごとに合った言語のバージョンを案内してもらうために使います。各バージョンは自分自身とほかのすべてのバージョンを挙げ、どのペアも互いを参照し合う必要があります。そうでないと、指定が無視されることがあります。以下では、seogrinder.com が12言語に hreflang を設定している方法と、Google のドキュメントにある hreflang の5つのミスを紹介します。

hreflangとは?何をするもので、どんなときに必要?

Google は、Tell Google about localized versions of your page(ページのローカライズ版を Google に伝える)というページでこの考え方を説明しています。言語や地域ごとにページの複数のバージョンがあるとき、それを Google に伝えると、検索で「言語や地域に応じて、最も適切なバージョンのページへユーザーを案内する」助けになるという内容です。原文は “help Google Search point users to the most appropriate version of your page by language or region” です。

Google は、この指定を推奨するケースを3つ挙げています。

  • メインコンテンツは1つの言語のままで、ナビゲーションやフッターなどのテンプレート部分だけを翻訳している。
  • 同じ言語の中で、似た内容に小さな地域差がある。たとえば、米国、英国、アイルランド向けの英語。
  • コンテンツ全体を翻訳している。たとえば、各ページにドイツ語版と英語版がある。

Google は別のバージョンを自力で見つけることもありますが、通常は明示的に示すのが最善だとしています。翻訳されたページは重複ではありません。ローカライズ版が重複とみなされるのは、“are only considered duplicates if the main content of the page remains untranslated”(ページの主要コンテンツが翻訳されないままの場合だけ)です(Google)。

hreflang にできないことが、2つあります。1つめは、Google がページの言語を判定する手段にはならないことです。Google は、hreflang も HTML の lang 属性も、ページの言語の判定には使わないと書いています(“doesn't use hreflang or the HTML lang attribute to detect the language of a page”、Google)。多言語サイトのページには、判定には目に見えるコンテンツを使うと補足されています。2つめは、順位の約束にはならないことです。Google が挙げる目的は1つだけで、検索する人それぞれに合ったバージョンを見せることです。

seogrinder.com は12言語をどうつないでいるか

このセクションでは、2026年11月5日に確認した seogrinder.com のブログの状態を説明します。トップページ / には hreflang タグがありません。各記事は、1つの言語で書かれた独立したページです。タグは自分で読んで確かめられます。

curl -sS https://seogrinder.com/ja/blog/seo-chekkurisuto | grep '<link rel="alternate" hreflang'

すると13行が出力されます。このチェックリスト記事の12言語版のどれで実行しても、同じ行が並びます。

<link rel="alternate" hreflang="en" href="https://seogrinder.com/en/blog/seo-audit-checklist">
<link rel="alternate" hreflang="ar" href="https://seogrinder.com/ar/blog/qaimat-tadqiq-seo">
<link rel="alternate" hreflang="de" href="https://seogrinder.com/de/blog/seo-audit-checkliste">
<link rel="alternate" hreflang="es" href="https://seogrinder.com/es/blog/checklist-seo-auditoria">
<link rel="alternate" hreflang="fr" href="https://seogrinder.com/fr/blog/checklist-audit-seo-gratuite">
<link rel="alternate" hreflang="hi" href="https://seogrinder.com/hi/blog/seo-audit-checklist-hindi">
<link rel="alternate" hreflang="it" href="https://seogrinder.com/it/blog/checklist-audit-seo">
<link rel="alternate" hreflang="ja" href="https://seogrinder.com/ja/blog/seo-chekkurisuto">
<link rel="alternate" hreflang="ko" href="https://seogrinder.com/ko/blog/seo-chekeuliseuteu-jeomgeom">
<link rel="alternate" hreflang="nl" href="https://seogrinder.com/nl/blog/seo-audit-checklist-uitvoeren">
<link rel="alternate" hreflang="pl" href="https://seogrinder.com/pl/blog/checklista-seo-audyt">
<link rel="alternate" hreflang="pt" href="https://seogrinder.com/pt/blog/checklist-de-auditoria-seo">
<link rel="alternate" hreflang="x-default" href="https://seogrinder.com/en/blog/seo-audit-checklist">

このブロックから分かることは次のとおりです。

  • 方法は1つだけ。 タグは HTML の head に置いています。これらのページは HTTP ヘッダーで hreflang を送っておらず、sitemap.xml にも xhtml:link のエントリはありません。Google は3つの方法を同等としていて、すべてを併用しても利点はないとしています。
  • シンプルな言語コード。 12個のコードだけで、地域は付けていません。どの言語にも、記事のバージョンが1つずつしかないからです。
  • ページは自分自身も挙げる。 ja の行が、そのページ自身のアドレスです。12言語版のすべてに、同じ行が並びます。
  • シンプルなタグ。 <head> の中に、1つにつき1つの <link> を置き、余計な属性は付けていません。Google は整った head を求めていて、hreflang を media のような属性と同じタグに混ぜないよう注意しています。
  • canonical は自分自身を指す。 各バージョンは、英語版ではなく自分自身のアドレスを canonical に指定しています。翻訳版は重複ではないという Google の説明と合っています。
  • 言語ごとに別のアドレスで、自動リダイレクトはしない。 /ja/blog/seo-chekkurisuto のように、アドレスは言語ごとに分かれ、slug も言語ごとに違います。Google は、Cookie やブラウザーの設定ではなく、言語ごとに別の URL を使うことを勧め、推測した言語で訪問者をリダイレクトすることは勧めていません。英語ページに Accept-Language: de を付けてリクエストすると、200 が返り、そのページにとどまります(2026年11月5日に確認)。各記事には、ほかのバージョンへの通常のリンクを並べた言語メニューもあります。

作り方。 各記事のファイルは、group という1行でトピックを示します。ブログのコードは、同じ group を持つファイルをすべて集め、メンバーごとに <link> を1つ出力して(英語が先で、あとは言語コード順)、x-default を英語版に設定します。ファイルのない言語には、行が付きません。そのため、英語とドイツ語にしかないトピックには、en、de、x-default の3行が付きます。Google は不完全なセットも認めています。“you can omit some languages on some pages; Google will still process the ones that point to each other”(一部のページで一部の言語を省いてもよい。互いを指している言語は Google が処理する)(Google)。

数え方。 次のループは、サイトマップからすべての記事のアドレスを読み取り、各ページの hreflang の行数を数えます。

for u in $(curl -sS https://seogrinder.com/sitemap.xml | grep -o 'https://seogrinder.com/[a-z][a-z]/blog/[^<]*'); do
  curl -sS "$u" | grep -c '<link rel="alternate" hreflang'
done | sort | uniq -c

2026年11月5日に実行すると、出力は 408 13 でした。つまり、13行のページが408ページ(12言語と x-default)です。その後、小さなスクリプトで同じ408ページを取得し、タグを比べました。どのページも自分自身を挙げ、挙げられたアドレスはすべて 200 を返してそのページを挙げ返し、x-default は英語版のアドレスと一致しています。ブログを変更するたびに、ブログのチェック(check:blog)が、すべての記事ページでこれらのルールを検査します。

x-default は何のためにある?

Google は x-default を “recommended for specifying the fallback page for users whose language settings don't match any of your site's localized versions”(サイトのどのローカライズ版にも言語設定が合わないユーザー向けに、フォールバックページを指定するために推奨)と説明しています(Google)。必須ではありません。

Google はさらに、この値はどのページにも付けられるものの、“designed for language selector pages and so it will work best with those”(言語選択ページ向けに設計されているので、そうしたページで最もよく機能する)と補足しています。記事には言語選択ページがないため、フォールバックは同じ記事の英語版にしています。ブログの一覧ページでは /en/blog です。これは私たちの判断であって、ルールではありません。

よくあるミス:Google のドキュメントにある hreflang の5つのエラー

Google のページには「Common Mistakes」(よくあるミス)というセクションがあり、3つの項目が載っています。ガイドラインにはさらに、「must」(必須)の付いた要件が2つあります。合わせて5つになり、以下がそれです。それぞれがどのくらいの頻度で起きるかは、Google は述べていません。結果が明記されているのは2つだけで、相互参照の欠落(タグが無視される)と、予約済みの地域コード(その部分が無視される)です。ほかの3つは、ルールが書かれているだけです。

1. 相互参照(戻りリンク)の欠落

ページ X がページ Y を挙げるなら、ページ Y もページ X を挙げる必要があります。Google のルールは次のとおりです。“If two pages don't both point to each other, the tags will be ignored”(2つのページが互いを指していなければ、タグは無視される)(Google)。理由も、Google が書いています。ほかのサイトが、あなたのページの別バージョンだと勝手に名乗れてしまっては困るからです。対処法は、すべてのバージョンで同じリンクのブロックを、1つの元データから出力することです。完全なセットを保つのが難しい場合、Google は一部のページで一部の言語を省くことを認めています。ただし、新しく追加した言語は、元の言語か主要な言語と、双方向にリンクするべきだとしています。

2. 自分自身を挙げないバージョン

すべての方法に共通するガイドラインは、“Each language version must list itself as well as all other language versions”(各言語バージョンは、自分自身とほかのすべての言語バージョンを挙げなければならない)です(Google)。HTML の方法では、「自分自身を含めて」(“including itself”)バージョンごとに1つのリンクを置き、どのバージョンでも同じセットにするということです。自分への参照がないと何が起きるかは、Google は述べていません。エラーとして扱い、行を追加してください。

3. 無効な言語コード

値の最初の部分は ISO 639-1 形式の言語で、そのあとに任意で地域を付けます。Google は “Specifying the region alone is not valid”(地域だけの指定は無効)と書いています。ベルギーの例では、be はベラルーシ語の言語コードなので誤りで、正しくは de-BE、nl-BE、fr-BE です。これらの規格にないコード(たとえば es-419)はサポートされません(zh-Hans のようなスクリプトコードは使えます)。大文字と小文字は区別されませんが、規格どおり、地域は大文字で書きます。

4. 無効な地域コード

地域は、公式に割り当てられた ISO 3166-1 Alpha 2 のコードでなければなりません。別の用途に予約されているコードについては、“Google Search ignores that part of the annotation”(Google 検索は、アノテーションのその部分を無視する)とされています。Google は、EU、UN、UK を効果のないコードとして挙げています。英国のコードは GB で、Google 自身の例にも en-GB があります。

5. 相対アドレスや不完全なアドレス

“Alternate URLs must be fully-qualified, including the transport method (http/https)”(代替 URL は、通信方式(http/https)を含む完全な形でなければならない)(Google)。Google の例では、https://example.com/foo が正しく、//example.com/foo や /foo は誤りです。

hreflang の確認方法

手作業では、上の curl コマンドを自分のページの1つで実行し、そのページが自分自身を挙げているかを見ます。次に、出力に出たアドレスのそれぞれに同じコマンドを実行し、最初のページが出てくるかを探します。これが、相互参照のテストです。Google は、サードパーティのデバッグツールも挙げていますが、それらは “are not maintained or checked by Google”(Google が保守も確認もしていない)としています。

SEOgrinder で確認する方法もあります。SEOgrinder は私たちのツールで、私たちが開発しています。ページをスキャンして「Google 上のページ」タブを開き、「言語 (hreflang)」カードを探してください。言語コード、自己参照、x-default、宛先が応答するか、宛先がこちらを挙げ返しているかをチェックします。すべて問題なければ、1行だけが表示されます。そうでなければ、チェックごとに結果が並び、問題はタスク一覧に入ります。

ミスSEOgrinder の表示(文言の例)
1. 相互参照の欠落「2 件の宛先が相互に参照していません」
2. 自己参照がない「自分自身を指定していません」
3 と 4. 無効なコード「無効な言語コードが 1 件」(言語と地域を、Google が挙げる規格に照らして検査)
5. 相対アドレス専用の行はありません。SEOgrinder は、相対アドレスをページを基準に解決してから検査するので、このミスはソースで探してください

制限が2つあります。1つめは、取得するのが1ページにつき最大10件の宛先だということです。13件のエントリがある私たちのページでは10件を検査し、そのことも表示します(「13 件中 10 件を取得して確認しました」)。2つめは、判定の対象が入力したページだということです。サイト全体を調べるには、上のようにアドレスをループで回してください。

よくある質問

言語ごとに別のアドレスがあれば、hreflang は必要ですか?

必須ではありません。Google は、hreflang がなくても別のバージョンを見つけることがありますが、通常は明示的に示すのが最善だとしています。

hreflang で順位は上がりますか?

Google のページは、そうは述べていません。目的は、言語や地域に応じて、最も適切なバージョンへユーザーを案内することだと説明しています。順位は、誰にも約束できません。

3つの方法のどれを使えばよいですか?

Google にとっては同等で、複数を併用しても利点はありません。Google は、HTML タグはサイトマップや HTTP ヘッダーを制御できないサイトに向き、ヘッダーは PDF のような HTML 以外のファイルに向くと述べています。私たちは HTML タグを使っています。

次のステップ

自分のページの1つで curl コマンドを実行し、そのページが自分自身を挙げていることと、宛先の1つが参照を返していることを確認します。次に、そのページを SEOgrinder でスキャンして「Google 上のページ」を開き、「言語 (hreflang)」カードで最初に問題を報告している行を直して、「再チェック」を押します。hreflang が8つのチェックグループのどこに入るかは、SEOチェックリストの記事で確認できます。

あわせて読みたい

ブログのほかの記事