hreflangとは?12言語の実例と、よくある5つのミス
結論: 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チェックリストの記事で確認できます。