# General Translation Knowledge Base: hreflang とは？設定方法を解説
URL: https://generaltranslation.com/ja/kb/what-is-hreflang.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: hreflang は、どの URL が同じページの言語版または地域版であるかを Google に伝え、検索結果に適切なページを表示させるための仕組みです。HTML の link タグ、HTTP の Link ヘッダー、またはサイトマップで追加し、すべてのリンクを相互に参照させたうえで、en-UK ではなく en-GB のような有効なコードを使用してください。
Category: 多言語SEO
Last updated: 2026-10-20
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-20

hreflang は URL 同士を対応付ける仕組みのため、言語ごとに個別の URL が用意されていなければ機能しません。URL 構成がまだ決まっていない場合は、まず[サブディレクトリ、サブドメイン、国別ドメイン](/kb/multilingual-url-structure)のいずれかを選んでから、このページに戻って hreflang を設定してください。

## hreflang でできること・できないこと

hreflang は、1 つのページに対応する複数の URL を 1 つのクラスターにまとめ、それぞれに言語と、必要に応じてリージョンのラベルを付けます。ドイツ語話者の検索で英語の料金ページがヒットした場合、Google は同じクラスター内のドイツ語 URL を代わりに表示できます。Google の[ローカライズ版に関するガイド](https://developers.google.com/search/docs/specialty/international/localized-versions)によると、注釈がなくても代替版を検出できる場合はあるものの、明示的に宣言することが推奨されています。

ただし、hreflang には実際以上の効果を期待しがちです。

* **リダイレクトではありません。** hreflang は、検索結果に表示する URL を Google が選ぶ際の手がかりにすぎず、特定の結果を保証するものではありません。訪問者がクリックするとその URL に移動し、それ以降の挙動はサーバー側の判断に委ねられます (詳しくは[サイトが配信する言語の選び方](/kb/locale-routing-seo)を参照してください) 。
* **言語を検出するものではありません。** Google によれば、ページの言語の検出には hreflang も HTML の `lang` 属性も使用しておらず、独自のアルゴリズムによってコンテンツから言語を判定しています。
* **未翻訳のページを解決するものではありません。** Google がローカライズ版を重複とみなすのは、メインコンテンツが翻訳されていない場合に限られます。ナビゲーションとフッターだけを翻訳したページは、hreflang でラベルを付けることはできても、別のページとして区別させることはできません。

## hreflang を追加する方法

Google は HTML、HTTP ヘッダー、サイトマップの 3 つの方法を同等に扱っており、複数を併用しても Google 検索でのメリットはないとしています。サイトの構成に合った方法を 1 つ選んでください。

### HTML の link 要素

`<head>` 内に、現在のページも含めて各バージョンにつき 1 つずつ `<link rel="alternate">` を配置します。このセットはすべてのバージョンで同一にします。URL は完全修飾形式で記述する必要があります (`/de/preise` ではなく `https://example.com/de/preise`) 。

```html
<!-- /en/pricing、/de/preise、/fr/tarifs のいずれの <head> にも同じものを記述 -->
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing" />
<link rel="alternate" hreflang="de" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing" />
```

hreflang を `media` などの他の属性と同じ `<link>` 内で組み合わせないでください。また、レンダリング後の HTML も確認しましょう。正しい構造の `<head>` の外に出てしまったリンクは無効になります。

### HTTP Link ヘッダー

PDF など `<head>` を持たないファイルの場合は、同じクラスタを `Link` レスポンスヘッダーで返します。各 URL は山かっこ (`<>`) で囲み、エントリはカンマで区切ります。

```http
Link: <https://example.com/en/guide.pdf>; rel="alternate"; hreflang="en",
      <https://example.com/de/leitfaden.pdf>; rel="alternate"; hreflang="de",
      <https://example.com/fr/guide.pdf>; rel="alternate"; hreflang="fr"
```

### XML サイトマップ

サイトマップを使えば、ページ内に注釈を記述せずに済みます。`xhtml` 名前空間を宣言し、URL ごとに個別の `<url>` エントリを設け、それぞれに自身を含むすべてのバージョンを列挙します。Google によると、これらの子エントリはサイトマップの URL 数の上限には含まれません。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/en/pricing</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
  <url>
    <loc>https://example.com/de/preise</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
  <url>
    <loc>https://example.com/fr/tarifs</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/pricing"/>
    <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/preise"/>
    <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs"/>
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/pricing"/>
  </url>
</urlset>
```

サイトマップ内のページエントリが複数のロケール別フォルダーにまたがる場合は、サイトマップをサイトのルートに配置してください。Google の[サイトマップに関するガイダンス](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)では、ディレクトリ単位の適用範囲や、サイトをまたいだ送信方法について説明されています。なお、hreflang の代替 URL には別ドメインの URL も指定できます。

## すべての方法に共通するルール

* **可能な限り、各ページ自身を含む同じ完全なセットを使用してください。** 言語バージョンが3つあれば、各ページに3つのエントリが必要です。完全なセットを維持するのが難しい場合でも、Google はより小さな相互参照グループを処理できます。その場合は、新しいバージョンと、元のバージョンまたは主要なバージョンとの間の相互リンクを優先してください。
* **リンクは相互でなければなりません。** ページ X がページ Y を記載していても、Y が X を記載していなければ、Google はそのペアを無視します。これにより、他のサイトがあなたのサイトのドイツ語版を名乗ることを防げます。
* **必要に応じて `x-default` を追加します。** これは、どの言語にも一致しない場合のフォールバック(言語セレクターやデフォルト言語のバージョンなど)を示します。hreflang を機能させるうえで必須ではありません。深い階層のページをすべてホームページに振り向けるのではなく、そのページに関連するフォールバックを指定してください。
* **コードは言語の後に、任意でリージョンを続けます。** 言語は ISO 639-1(`de`)、リージョンは ISO 3166-1 alpha-2(`de-CH`)で指定し、大文字・小文字は区別されません。リージョンのみの指定は無効です。また、言語の位置に国コードを入れると別の意味になります。たとえば `be` はベラルーシ語であり、ベルギーではありません。
* **文字体系も指定できます。** Google は `zh-Hans` や `zh-Hant` などの ISO 15924 文字体系サブタグに対応しており、リージョンを付けることもできます(`zh-Hans-US`)。`zh-TW` の場合は、リージョンから繁体字中国語であると判断されます。
* **リージョンバリアントには言語のみのフォールバックを用意してください。** `en-IE`、`en-CA`、`en-AU` のページがある場合は、それ以外の地域の英語話者向けに `en` ページを追加してください(3つのうちいずれかを兼ねてもかまいません)。

有効なロケールコードであっても、ここでは使えないものがあります。`es-419`(ラテンアメリカ向けスペイン語)は正しい BCP 47 タグですが、Google の hreflang は ISO 3166-1 のリージョンにしか対応していないため、そのページには `es` を指定するか、`es-MX` や `es-AR` などの具体的な国を指定してください。

## hreflang を使うページでは自己参照カノニカルを使うべきか?

それぞれ独立した翻訳ページであれば、推奨されるカノニカルは通常そのページ自身です。Google の[重複 URL に関するガイダンス](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)では、hreflang を使用する場合は同じ言語のカノニカルを指定し、同じ言語のカノニカルがない場合は最適な代替ページを指定するよう推奨しています。すべての翻訳ページのカノニカルを英語ページに向けるのは避けてください。

同じ言語の地域別ページについては、別途検討が必要です。`en-US` と `en-GB` の内容が重複している場合は、優先する英語のカノニカルを1つ選び、hreflang でリージョンごとのターゲティングを示すことができます。カノニカルと hreflang のシグナルに矛盾がないようにし、Google が選択したカノニカルを Search Console で確認してください。宣言したカノニカルは強力なシグナルですが、必ず採用されるとは限りません。

```html
<!-- https://example.com/de/preise の <head> 内 -->
<link rel="canonical" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="en" href="https://example.com/en/pricing" />
<link rel="alternate" hreflang="de" href="https://example.com/de/preise" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/tarifs" />
```

同じページには、関連する注意点がさらに2つあります。Googleは `hreflang` 属性を含む `rel="canonical"` リンクを無視するため、この2種類のリンクは別々に記述してください。また、Googleはカノニカル化の際、hreflangクラスタに属するURLを優先します。クラスタ内の各バージョンにはカノニカルURLを指定し、トラッキングパラメータ付きのURLは使用しないでください。

## よくある hreflang のエラーとは？

* **相互リンクの欠落。** Google が挙げるよくある間違いの筆頭です。多くの場合、特定のロケールのテンプレートでこのブロックが抜けているか、新しい言語を一部のページにだけ追加し、残りのページには追加していないことが原因です。
* **無効なコード。** Google は `UK` や `EU` などの予約済みリージョンコードを無視するため、`en-UK` のリージョン部分は機能しません。`en-GB` を使用してください。また、`es-419` の `419` のようにサポートされていないリージョンも認識されません。
* **相対 URL やプロトコルが混在した URL。** 代替リンクは完全修飾 URL で指定する必要があります。また Google は、サイトが HTTPS で配信されている場合、hreflang に `http://` の URL を指定しないよう警告しています。
* **意図したインデックス可能なページに直接到達しない代替リンク。** リダイレクトやエラーページではなく、最終的なカノニカル URL を指定してください。`noindex` のページは検索結果から除外されるため、Google に表示させたいページとしては使えません。ステータスコードだけでなく、リンク先のコンテンツとその相互リンクも確認してください。
* **テンプレート部分だけが翻訳されたページ。** hreflang を使ってもこうしたページは区別できず、Google も内容が重複していると検索体験を損なうとしています。

## hreflang が機能しているかを確認するには

Search Console の「インターナショナル ターゲティング」レポートは廃止されました。Google は国別ターゲティング設定とともにこのレポートを[非推奨にしました](https://support.google.com/webmasters/answer/12474899)が、hreflang については引き続きサポートし、利用しているとしています。代わりに、次の方法で確認してください。

* **1 ページを抜き取りで確認する。** HTML を取得し、そのページに自身とすべての兄弟ページが記載されていることを確認します。

  ```bash
  curl -s https://example.com/de/preise | grep -o '<link[^>]*hreflang[^>]*>'
  ```

* **公開中のページをテストする。** Google のガイドでは、Google 自身は保守していないサードパーティ製ツールが 2 つ紹介されています。単一の URL を検査できる [Merkle&#39;s hreflang tag tester](https://technicalseo.com/seo-tools/hreflang/) と、タグを作成できる [Aleyda Solis&#39;s hreflang generator](https://www.aleydasolis.com/english/international-seo-tools/hreflang-tags-generator/) です。

* **サイト全体をクロールする。** クローラーを使えば、全ページを対象に相互参照を検査できます。[Screaming Frog&#39;s hreflang audit](https://www.screamingfrog.co.uk/seo-spider/tutorials/how-to-audit-hreflang/) では、相互リンクの欠落、ステータスが 200 以外の代替リンクや `noindex` の代替リンク、無効なコード、カノニカル URL になっていない代替リンクが報告されます。

* **サイトマップを検証する。** `xmllint --noout sitemap.xml` を実行し、Google に検出される前に XML の形式エラーを見つけましょう。

## General Translation で hreflang を設定する

General Translation の `gt-next` は、[`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware) によって言語ごとに個別の URL を割り当てます。これが hreflang を使うための前提条件です。`pathConfig` オプションでローカライズされたスラッグ (例：`/fr/a-propos`) を設定すると、ローカライズされた各パスがそのまま、クラスターに列挙する `href` になります。

hreflang 注釈自体はアプリ側で管理します。Next.js は `metadata.alternates.languages` をもとに `<link rel="alternate" hreflang>` タグを出力します。[多言語対応の Next.js アプリで SEO を設定するには？](/kb/multilingual-nextjs-seo) では、カノニカルとすべての代替リンクを一度の呼び出しで返すヘルパーを紹介しています。設定済みのロケールを候補とし、各ページについて実際に公開済みのバージョンのみを列挙してください。

中国語を `/cn` で配信する場合など、ロケールをエイリアスでルーティングしている場合は、[ロケールエイリアスの SEO ガイド](/docs/react/nextjs/locale-alias-seo) を参照してください。このガイドでは [`resolveCanonicalLocale`](/docs/react/nextjs/reference/functions/resolve-canonical-locale) を使用して、URL は `/cn` のまま、hreflang には BCP 47 コードの `zh` を設定しています。

## 重要なポイント

* hreflang は、検索結果に表示する URL を言語とリージョンに対応付けるためのものです。訪問者をリダイレクトしたり、ページの言語を Google に伝えたりするものではありません。
* 指定方法は 1 つに絞ってください (HTML の `<link>`、PDF 向けの HTTP `Link` ヘッダー、またはサイトマップの `xhtml:link`) 。Google はいずれも同等に扱います。
* 自己参照と相互リンクを含め、対応する URL をすべて揃えることを目指してください。相互リンクのグループが小規模でも処理はされます。`x-default` は任意です。
* コードは ISO 639-1 の言語コードに、任意で ISO 3166-1 alpha-2 のリージョンまたは ISO 15924 の文字体系を組み合わせます。`en-UK` ではなく `en-GB`、`es-419` ではなく `es-MX` を使用してください。
* カノニカルは一貫させてください。翻訳ページごとに内容が異なる場合は、通常は自己参照にします。同じ言語で地域別に重複するページは別途扱い、相互リンクが正しく設定されているかをクローラーで確認してください。

## Related questions

- [多言語対応の Next.js アプリで SEO を設定するには？](https://generaltranslation.com/ja/kb/multilingual-nextjs-seo.mdx): 各言語に /en/about や /es/about のようなプレフィックス付きの URL を割り当て、公開している言語ごとに html lang、自己参照のカノニカル、x-default を含む hreflang の代替リンク、翻訳済みのタイトルと説明文、サイトマップのエントリを出力します。未公開のバージョンには noindex を指定します。General Translation の gt-next は各言語を専用の URL にルーティングし、getGT でタイトルを翻訳します。
- [多言語SEOにおけるサブディレクトリ・サブドメイン・ccTLDの比較](https://generaltranslation.com/ja/kb/multilingual-url-structure.mdx): 1つのプロダクトでサイトとリリースプロセスを共有するなら、example.com/de/ のようなサブディレクトリを使いましょう。国を示せるのは ccTLD だけで、サブドメインなら個別にホスティングできます。Google は ?lang= パラメータを推奨しておらず、.io や .ai のようなバニティドメインは汎用ドメインとして扱います。
- [言語リダイレクトと SEO：URL、クッキー、Accept-Language のどれを使うべきか](https://generaltranslation.com/ja/kb/locale-routing-seo.mdx): Googlebot は Accept-Language ヘッダーを送信せず、クロールの大半を米国の IP アドレスから行います。そのため、インデックスさせたいすべてのページの言語は URL で決めましょう。保存済みのクッキーの選択、次いで Accept-Language を使うのは、/ のような中立的なルートのリダイレクト先を決める場合だけにとどめ、その際は一時的な 302 または 307 を使います。
- [言語切り替え機能のベストプラクティス：UX、SEO、アクセシビリティ](https://generaltranslation.com/ja/kb/language-switcher.mdx): 各言語は Deutsch や 日本語 のようにその言語自身の名称で表記し、国を表す国旗は使わないでください。各選択肢からは、クロール可能なリンクで同じページの該当言語版へ遷移させ、選択内容はクッキーに保存します。ローカライズされた URL は決して自動リダイレクトしないでください。
- [多言語アプリのローカライゼーションテスト チェックリスト](https://generaltranslation.com/ja/kb/multilingual-app-launch-checklist.mdx): 本番環境のビルドで、サポート対象のすべてのロケールについて次の9項目をテストしてください：エラー状態やメールを含むジャーニー全体、言語の切り替え、複数形、通貨とタイムゾーン、テキストの伸長、右から左のレイアウト、アクセシビリティ、翻訳の配信、クロール可能な言語別URL。各項目には明確な合格条件を設けてください。

## Previous and next questions

- Previous question: [CSS で RTL（右から左）言語をサポートするには？](https://generaltranslation.com/ja/kb/right-to-left-css.mdx)
- Next question: [i18n の JSON ファイルを翻訳するには？](https://generaltranslation.com/ja/kb/translate-json-files.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/ja/kb/sitemap.md) for every article.
