hreflangタグの使い方:完全ガイドと無料ツール

サイトが複数の言語や国に向けてコンテンツを提供しているなら、hreflangタグは、どのURLがどの読者向けのものかを検索エンジンに伝える役割を持ちます。正しく機能するクラスターは、Googleが各読者に適切なバージョンを表示する助けになります。壊れたクラスターでは、Googleが重複ページの間を行き来したり、誤ったバージョンをランク付けしたりする事態になりかねません。このガイドでは、構文、リターンタグ(相互参照)、x-default、そしてアノテーションセットを知らぬ間に無効化するミスを解説します。加えて、有効なタグを出力する無料のhreflangタグジェネレーターと、XMLサイトマップによる代替方法も紹介します。

hreflangタグとは何か?

hreflangは、HTMLの<link>要素に指定する属性で、一連のURLが同じコンテンツのローカライズ版であることを示すものです。

<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />

このタグは、すべての言語バージョンの<head>内に記述します。

押さえておくべき事実が2つあります。1つは、hreflangはヒントであって指令(ディレクティブ)ではないということ——有効なセットはGoogleが適切なバージョンを表示する助けにはなりますが、強制はしません。もう1つは、Googleはページの言語の検出にhreflang(やlang属性)を使わないということです。言語の判定はアルゴリズムで行われます。

hreflangの構文:言語・文字・地域コード

値は「言語、任意の文字(スクリプト)、任意の地域」という固定の順序に従い、それぞれISO 639-1、ISO 15924、ISO 3166-1 Alpha 2から採ります。コードの大文字・小文字は区別されませんが、慣例では言語を小文字、地域を大文字で書きます。

有効なコードの例:

  • en-GB——英国ユーザー向けの英語
  • zh-Hans——中国語(簡体字)

Googleのドキュメントが指摘する落とし穴:

  • en-UK——無効。UKはISO 3166-1で正式に割り当てられた要素ではないため、Googleはこれを無視します(EUやUNも同様)。en-GBを使いましょう。
  • gb-en——順序の誤り。言語は必ず先に来ます。
  • es-419——数字のUN地域コードには未対応。有効なのはISO 3166-1 Alpha 2だけです。
  • beを「ベルギー」の意味で使うケース——地域だけの指定は無効で、しかもbeはベラルーシ語という言語コードです。nl-BE、fr-BE、de-BEを使いましょう。

1つの言語の複数ロケールに関するGoogleのガイダンスはこうです。1つの言語の複数のロケール(en-IE、en-CA、en-AUなど)をターゲットにするなら、それ以外の全員向けに汎用のenを包括的に用意すること。Googleはこれを「良いアイデア」と呼んでおり、必須要件ではありません。また、この包括用エントリは地域版のいずれかとURLを共有してかまいません——enはen-IEと同じURLを指していても大丈夫です。

リターンタグ:すべてのバージョンが参照し返さなければならない理由

リターンタグとは相互参照のルールです。ページXがページYにリンクしているなら、YはXへリンクし返す必要があります——さらに、各バージョンは自分自身もリストに入れなければなりません。Googleのルールでは、2つのページが互いを指し合っていなければ、そのアノテーションは無視されます。よく挙げられる根拠は、返しのリンクがなければ、誰でも自分のページをあなたのページの代替版だと主張できてしまうというものです。英語版とドイツ語版を持つサイトでは、両ページの<head>に同じタグセットが入ります。

<link rel="alternate" hreflang="en" href="https://example.com/" />
<link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />

どちらのページにもこの2行が入ります。どれか1つのバージョンでセットを省くと、クラスターは崩れ始めます。Googleのドキュメントには緩和策も記載されています。完全な双方向セットの維持が難しくなったら、一部のページで一部の言語を省略してよい——その場合も、互いを指し合っているペアは機能し続けます。優先順位に関するGoogleの方針は、新しく追加する言語バージョンは、サイトの起点となった(主要な)言語と双方向にリンクすることです。フランス語の.frページから成長したサイトなら、新しいスペイン語版はまずフランス語ページとリンクを結び、次に互い同士を結びます。

x-defaultとは何か、いつ必要か?

x-defaultは予約値で、リストした言語のどれもユーザーのブラウザ設定と一致しないときに提供するURLを指定します——linkタグを1つ追加するだけで、言語コードは付きません。

<link rel="alternate" hreflang="en-GB" href="https://example.com/uk/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/select-language/" />

x-defaultは任意ですが、設定が推奨されます——言語選択ページや自動リダイレクトするホームページ向けに設計されたものです。デフォルト言語版を指すのがもう1つの定番パターンで、ジェネレーターもこちらを想定しています。

hreflangタグを実装する3つの方法

Googleはこの3つの方法をまったく同等に扱います。ドキュメントには、3つすべてを同時に使っても「検索面でのメリットはなく」、1つに絞るより管理が難しくなるだけだと記載されています。

1. head内のHTML linkタグ

小規模サイト向けの方法です。すべてのバージョンの整形式な<head>内に、完全なセットを配置します。Googleのルールが2つあります。1つは、タグが必ずheadの中に実在すること(CMSがマークアップを書き換える場合は、レンダリング後のHTMLを検証してください)。もう1つは、hreflangをmediaなどの属性と1つのタグに併記しないことです。

2. XMLサイトマップによるアノテーション

規模が大きくなったら、hreflangをHTMLの外に出しましょう。各<url>エントリの中に、<loc>と並べて、自分自身を含むすべてのバージョンぶんのxhtml:link子要素を追加します。

<url>
  <loc>https://example.com/</loc>
  <xhtml:link rel="alternate" hreflang="en" href="https://example.com/" />
  <xhtml:link rel="alternate" hreflang="de-DE" href="https://example.com/de/" />
</url>

xmlns:xhtml="http://www.w3.org/1999/xhtml"名前空間を宣言し、バージョンごとに<url>ブロックを繰り返します。子要素の順序は問わず、Googleはxhtml:linkの子要素がサイトマップのURL上限に数えられないことも明言しています——プロトコルの50,000 URL上限が数えるのは<url>エントリだけだからです。

3. HTTP Linkヘッダー

PDFなどのHTML以外のファイルには、ファイルを配信する箇所でLinkヘッダーを設定します——nginxなら、対象のロケーションへのadd_headerルールで書きます。

add_header Link '<https://example.com/file.pdf>; rel="alternate"; hreflang="en",
                <https://example.com/de/file.pdf>; rel="alternate"; hreflang="de"';

ApacheのHeader setやCDNのレスポンスヘッダールールでも同じことができます。

無料ツールでhreflangタグを生成する方法

hreflangタグジェネレーターはセットを組み立て、入力しながら検証を行います——登録不要で、ブラウザ内で動作します。

ステップ1:完全なセットを組み立てる

バージョンごとに1行追加します——左に言語コード、右に絶対URL——注釈を付けるページ自身を指す行も含めます。自己参照は必須で、この同一のセットをすべてのバージョンのheadに貼り付けます(ステップ4)。つまり、一度だけ、完全な形で作ります。コードは「言語 – 文字 – 地域」のパターンに対してリアルタイムに検証され、en、pt-BR、zh-Hansは通り、gb-enにはフラグが立ちます。大文字・小文字は正規化され、en-gbはen-GBに変換されます。

ステップ2:x-defaultのURLを設定する

フォールバックURL(デフォルト言語版または選択ページ)を入力するか、空のままにしてx-defaultを省略します。URLがセットの外を指していると警告が出ます。選択ページであれば、言語クラスターの外に置くのが設計どおりですから、正常かつ正しい警告です。選択ページでないのに警告が出るなら、たいていは入力ミスです。

ステップ3:生成してチェック結果を確認する

Generate hreflang tagsをクリックします。チェックリストは、重複した言語コードをエラーとして指摘し、絶対URLでないURLを拒否し、自己参照と1エントリだけのセットについて警告を出します。1エントリだけというのは、たいてい他のバージョンの入れ忘れです——hreflangは2つ以上のバージョンが互いを参照してはじめて価値が出るので、追加しましょう。対応する版が存在しないページには、そもそもhreflangは不要です。赤い項目を修正したら、再生成します。

ステップ4:必要な形式で出力をコピーする

出力は2つのタブに分かれています。HTML link tagsはそのまま<head>に使えます——同一のブロックをすべてのバージョンに貼り付けてください。XML sitemapは完全なサイトマップではなく<url>ブロックを出力します。完全なサイトマップの<urlset>要素の中(名前空間は上記のとおり)に貼り付けてください。XMLサイトマップジェネレーターで作ったベースファイルなどが使えます。Copy codeとDownload fileで出力を移します。多言語headの残りの部分は、メタタグジェネレーターでまかなえます。

よくあるhreflangのミス(と修正方法)

ミス1:自己参照エントリの入れ忘れ

最も多いエラーです。ページ自身を除くすべてのバージョンがリストされている状態です。Googleのルールは逆で、各バージョンは自分自身と他のすべてをリストしなければなりません。修正方法:現在のページの行を追加します。

ミス2:片方向のアノテーション(リターンタグの欠落)

ドイツ語ページが英語ページをリストしているのに、逆方向は一度も追加されていない——Googleは片方向のペアを無視します。修正方法:すべてのバージョンに同一のセットを置くこと。リリースやURL変更のあとは、両側を再確認します。

ミス3:無効または順序の誤ったコード

en-UK、es-419、gb-en、地域だけの指定——Googleは無効な地域や不正な形式のコードを無視し、クラスターのその部分を静かに無効化します。修正方法:言語を先に(ISO 639-1)、地域を後に(ISO 3166-1 Alpha 2)。ジェネレーターはコードをリアルタイムに検証します。

ミス4:hreflangがcanonicalと衝突する

各バージョンは自己参照のcanonicalを持つべきです。ドイツ語ページが英語ページにcanonicalを向けていると、hreflangがそのページを「対等な代替版」と呼ぶまさにその瞬間に、canonicalが「重複」と宣言することになります——セットの機能を止めかねない、矛盾したシグナルです。修正方法:どこも自己canonicalにして、グループ化はhreflangに任せます。

ミス5:セット内のリダイレクトURL・相対URL

代替URLは完全修飾でなければなりません——https://example.com/de/はOK、/de/や//example.com/de/は不可——そして、リダイレクトチェーンではなく200を返すべきです。de-DEエントリがどこかへ301リダイレクトしていると、Googleはまずそのチェーンを解決するよう強制されます。監査のときにはリダイレクトチェーンチェッカーにURLを通し、レンダリング後のソースでタグが整形式のheadの中に載っていることを確認します。

よくある質問

hreflangタグはランキングを改善しますか?

直接は改善しません——hreflangは、Googleが適切なバージョンを提供するのを助けるルーティングシグナルであって、ランキングの押し上げではありません。効果は間接的ですが本物です。競合する重複バージョンが減り、ユーザーが自分の言語のページにたどり着くようになります。

hreflangタグはheadに入れなければなりませんか?

HTMLメソッドを使う場合だけです。この方法では、タグは整形式のheadの中に置かなければなりません。headのマークアップを制御できない場合は、サイトマップとHTTPヘッダーのメソッドが同等の代替手段になります。

x-defaultは必須ですか?

いいえ。任意の項目で、言語選択ページや自動リダイレクトするホームページで最も効果を発揮します。他の大半のサイトはデフォルト言語版を指しており、これも安全なパターンです。

hreflang URLは異なるドメインに置けますか?

はい。代替URLはドメインを共有する必要がなく、だからこそhreflangはexample.deやexample.co.jpのようなccTLDで標準的な手法です。ccTLDや国サブドメインはGoogleに地理的なヒントを与えますが、どのURL同士が互いの代替版かまでは教えません。すべてのバージョンを明示的にマッピングしましょう。

hreflangタグを確認する方法と、修正の反映までの期間は?

各バージョンのレンダリング後のソースを確認し、自己参照を含む完全なセットがheadの中に載っていることを確かめます。サードパーティのhreflangテスターはライブページを検証します(GoogleはAleyda SolisのジェネレーターとMerkleのhreflangテスターを挙げています)。クローラーを使えば、このチェックをサイト全体に拡大できます。Search Consoleのインターナショナルターゲティングレポートは2022年に廃止されたため、そこに専用のhreflangエラーレポートはもうありません。修正は、クラスター内の各URLが再クロールされるたびに反映されていきます——通常は数日から数週間です。

en-USとen-GBのような同一言語ページにhreflangを使えますか?

はい。1つの言語内の地域差は、Google自身のユースケースに含まれています。米国、英国、アイルランドに向けた英語コンテンツがその例です。翻訳は必須ではなく、タグはGoogleにどの地域バリアントを提供すべきかを伝えます——違いが通貨や配送情報だけということもあります。

セット内の1つのバージョンがnoindexまたはブロックされているとどうなりますか?

クラスター内のすべてのURLは、クロール可能かつインデックス可能であるべきです。noindexまたはブロックされたページは代替版として表示できず、死んだエントリは残りのバージョンのペアリングを弱めます。ブロックを解除するか、すべてのページのセットからそのバージョンを外しましょう。

hreflang URLはcanonical URLと完全に一致しなければなりませんか?

一致させるべきです。各エントリが指すのは、そのバージョンのcanonicalが指すURL——同じプロトコル、ホスト、末尾のスラッシュです。エントリは完全修飾URLでなければならず、非正規のターゲット(トラッキングパラメータ、うっかり混入した末尾のスラッシュ)は、Googleにペアリングの前に重複の解決を強制します。完全一致のURLと自己canonicalの組み合わせが、クラスターをきれいに保ちます。