多言語・多地域サイトを運営しているのに「日本語ユーザーに英語版が表示される」「Googleに言語バリアントを正しく認識してもらえない」というトラブルに悩んでいませんか?その原因のほとんどは <link rel="alternate" hreflang="..."> の設定漏れや記述ミスにあります。
hreflangタグは多言語SEOの要です。正しく設定すれば、日本語ユーザーには日本語ページ、英語ユーザーには英語ページが検索結果に表示され、無用な重複コンテンツ評価も防げます。本記事では、hreflangタグの基本から実装方法、よくあるミスと対処法まで、コードサンプルつきで徹底解説します。設定後はhreflangジェネレーターで正しいタグを自動生成できます。
hreflangタグとは?
hreflangタグは、Googleに対して「このページにはほかの言語・地域向けの代替バージョンが存在する」と伝えるHTMLタグです。2011年にGoogleが導入し、現在はGoogleとYandexが対応しています(BingはContent Language HTTPヘッダーを使用)。
hreflangが必要な場面
- 同一コンテンツを複数言語で提供するサイト:日本語版・英語版・中国語版など
- 同一言語で地域ごとに内容が異なるサイト:英語(米国)・英語(英国)・英語(オーストラリア)など
- 国・地域ターゲティングを明確にしたいサイト:ECサイトで通貨・配送先が異なる場合など
hreflangで解決できる問題
- 日本語ユーザーに英語ページが表示されるミスマッチを防ぐ
- 翻訳ページどうしの重複コンテンツペナルティリスクを軽減する
- 各言語版ページのSEO評価を正しいURLに集約する
- Google Search Consoleの「国際ターゲット設定」エラーを解消する
hreflangはあくまで「ヒント(hint)」であり、Googleへの強制指示ではありません。それでも正しく設定することで、クロールの効率化と検索結果のマッチング精度が大幅に向上します。
hreflangタグの書き方
hreflangタグは3つの実装方法があります。それぞれメリットと適した用途が異なります。
方法1:HTMLの <head> に記述する(最も一般的)
HTMLの <head> セクション内に <link> タグを記述します。ページ数が少ないサイトや、CMSでテンプレート管理できるサイトに向いています。
<!-- 日本語ページ(/ja/)の <head> 内に記述する例 -->
<link rel="alternate" hreflang="ja" href="https://example.com/ja/page">
<link rel="alternate" hreflang="en" href="https://example.com/en/page">
<link rel="alternate" hreflang="en-US" href="https://example.com/en-us/page">
<link rel="alternate" hreflang="en-GB" href="https://example.com/en-gb/page">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page">
言語コードは IETF BCP 47 形式で指定します。言語のみ(ja、en)、または言語+地域(en-US、zh-TW)の組み合わせが使えます。
方法2:XMLサイトマップに記述する(大規模サイト向け)
ページ数が多い場合は、XMLサイトマップに一括記述する方法が効率的です。すべてのURLを <xhtml:link> 要素で相互参照します。
<?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/ja/page</loc>
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/page"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/page"/>
</url>
<url>
<loc>https://example.com/en/page</loc>
<xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/page"/>
<xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/page"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/page"/>
</url>
</urlset>
方法3:HTTPレスポンスヘッダーに記述する(非HTMLファイル向け)
PDFなどHTMLでないファイルには、サーバーのHTTPレスポンスヘッダーにhreflang情報を付加します。
Link: <https://example.com/ja/document.pdf>; rel="alternate"; hreflang="ja",
<https://example.com/en/document.pdf>; rel="alternate"; hreflang="en",
<https://example.com/en/document.pdf>; rel="alternate"; hreflang="x-default"
主な言語コード一覧
ja— 日本語en— 英語(地域不問)en-US— 英語(米国)en-GB— 英語(英国)zh-CN— 中国語(簡体字)zh-TW— 中国語(繁体字)ko— 韓国語fr— フランス語de— ドイツ語es— スペイン語
x-defaultの使い方
hreflang="x-default" は、どの言語・地域にも一致しないユーザーに表示するデフォルトページを指定するための特殊な値です。Googleが2013年に導入しました。
x-defaultを設定すべき場面
- 言語選択ページ(ランディングページ)を持つサイト
- 英語を国際共通語として使用するサイト
- 対応していない言語のユーザーを特定ページに誘導したい場合
- 地域限定サービスで、対象外の訪問者向けに案内ページを設けている場合
x-defaultの設定例
下記は日本語・英語・フランス語の3言語サイトで、英語ページをデフォルトに設定する例です。
<!-- すべての言語バリアントのページに同じセットを記述する -->
<link rel="alternate" hreflang="ja" href="https://example.com/ja/about">
<link rel="alternate" hreflang="en" href="https://example.com/en/about">
<link rel="alternate" hreflang="fr" href="https://example.com/fr/about">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/about">
重要:x-default に指定するURLは、必ずhreflangセットの中の既存のURL(上記例では hreflang="en" と同じURL)にしてください。存在しないURLを指定するとエラーになります。
言語選択ページへの適用例
<!-- 言語選択トップページ(example.com/)を 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="x-default" href="https://example.com/">
よくある実装ミスと対処法
hreflangは設定が複雑なため、実装ミスが非常に多いタグです。Google Search Consoleで「hreflangエラー」が表示されたときの主な原因と対処法を解説します。
ミス1:相互参照が片方しかない(最多ミス)
日本語ページから英語ページへの hreflang を記述しても、英語ページから日本語ページへの参照がないと無効になります。すべてのバリアントが双方向で参照し合う必要があります。
- NG:日本語ページにhreflangあり、英語ページにhreflangなし
- OK:日本語ページと英語ページの両方に同じhreflangセットを記述する
ミス2:言語コードが正しくない
Googleが受け付けない形式で言語コードを記述するとエラーになります。
- NG:
hreflang="japanese"、hreflang="jp"、hreflang="JA"(大文字、間違ったコード) - OK:
hreflang="ja"(ISO 639-1の小文字2文字コード) - NG:
hreflang="zh"(中国語は簡体字・繁体字を区別する必要がある) - OK:
hreflang="zh-CN"(簡体字)またはhreflang="zh-TW"(繁体字)
ミス3:URLが相対URLになっている
hreflangのhref属性には必ず絶対URLを使用します。相対URLは無効です。
- NG:
href="/ja/page" - OK:
href="https://example.com/ja/page"
ミス4:x-defaultの設定忘れ
対応言語以外のユーザーへのフォールバックとして、x-defaultは原則設定しておくべきです。未設定でもエラーにはなりませんが、Googleが最適なページを判断できず、想定外のページが表示される場合があります。
ミス5:302リダイレクト先のURLを指定している
hreflangには最終的にアクセスできる正規URL(canonicalと一致するURL)を指定してください。リダイレクト途中のURLを指定すると正しく処理されません。
ミス6:ページが削除・移動されたのにhreflangを更新していない
ページのURLを変更した場合は、そのページを参照しているすべての言語バリアントのhreflangも更新が必要です。古いURLへの参照が残ると404エラーとして処理されます。
WordPress・Next.js・Astroでの設定方法
主要なCMS・フレームワークでのhreflang設定方法を解説します。
WordPressでの設定
WordPressでは、SEOプラグインを使うのが最も簡単です。
- Yoast SEO:多言語プラグイン(WPML・Polylang)と連携すると自動でhreflangを出力します。WPML使用時はYoast SEOのhreflang出力を有効化してください。
- Rank Math:多言語設定画面からhreflangを自動出力できます。Polylangとの連携をサポートしています。
- 手動設定:
functions.phpのwp_headフックにechoでlinkタグを出力する方法もありますが、ページ追加のたびに更新が必要です。
Next.jsでの設定
Next.jsはApp RouterとPages Routerで設定方法が異なります。
// App Router: app/[lang]/page.tsx
export async function generateMetadata({ params }) {
return {
alternates: {
languages: {
'ja': '/ja/page',
'en': '/en/page',
'x-default': '/en/page',
},
},
};
}
// Pages Router: pages/[lang]/page.tsx
import Head from 'next/head';
export default function Page() {
return (
<Head>
<link rel="alternate" hreflang="ja" href="https://example.com/ja/page" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />
</Head>
);
}
Astroでの設定
Astroでは <head> スロットに直接記述するか、i18n設定を活用します。
---
// src/pages/ja/page.astro
const alternates = [
{ hreflang: 'ja', href: 'https://example.com/ja/page' },
{ hreflang: 'en', href: 'https://example.com/en/page' },
{ hreflang: 'x-default', href: 'https://example.com/en/page' },
];
---
<head>
{alternates.map(({ hreflang, href }) => (
<link rel="alternate" {hreflang} {href} />
))}
</head>
どのプラットフォームでも、hreflangタグを生成したらhreflangジェネレーターでタグセットの正確性を確認することをお勧めします。
よくある質問
- Q. hreflangタグはBingでも有効ですか?
- BingはhreflangタグをGoogleほど積極的に解釈しません。Bingの多言語対応には、HTTPレスポンスヘッダーの
Content-Language設定やBing Webmaster Toolsでの地域設定が有効です。ただし、hreflangを設定しても悪影響はないため、Googleとの共存は問題ありません。 - Q. hreflangとcanonicalタグは同時に設定できますか?
- はい、両方同時に設定することが推奨されます。canonicalは「このURLが正規版」と伝え、hreflangは「この正規版には他言語の対応ページがある」と伝えます。canonicalのURLとhreflangのhref属性のURLが一致していることを確認してください。矛盾するとGoogleが混乱し、意図した言語ページが表示されないことがあります。
- Q. サブドメインとサブディレクトリ、どちらが多言語SEOに有利ですか?
- 一般的にはサブディレクトリ(example.com/ja/)が管理しやすくSEO上も推奨されます。サブドメイン(ja.example.com)は別サイトとして扱われることがあり、ドメインパワーが分散します。どちらの構成でもhreflangは正しく機能しますが、新規サイトであればサブディレクトリ構造をお勧めします。
- Q. 翻訳が完全でないページにもhreflangを設定すべきですか?
- 機械翻訳のみで品質が低いページは、hreflangで参照しても検索品質に悪影響を与える可能性があります。Googleは低品質な翻訳ページを評価しないことがあるため、hreflangは人間がレビューした十分な品質の翻訳ページにのみ設定するのが理想です。品質が低い場合は
<meta name="robots" content="noindex">を設定してインデックスから除外することも検討してください。 - Q. hreflangエラーはSEOに直接影響しますか?
- hreflangエラーが直接的なペナルティになることはありませんが、Googleが言語バリアントを正しく認識できなくなります。その結果、検索ユーザーの言語と一致しないページが表示され、直帰率の上昇やコンバージョン率の低下につながります。Google Search Consoleの「国際ターゲット設定」レポートでエラーを定期的に確認し、修正することを強くお勧めします。
まとめ
hreflangタグは多言語SEOに欠かせない設定です。本記事のポイントを振り返ります。
- hreflangとは:Googleに言語・地域バリアントを伝えるタグ。多言語サイトの検索精度向上に必須
- 実装方法:HTMLの <head>・XMLサイトマップ・HTTPヘッダーの3種類。ページ数に応じて選択
- x-default:対応言語以外のユーザー向けフォールバックページを指定。原則設定しておく
- よくあるミス:相互参照の欠如・間違った言語コード・相対URL・x-default未設定に注意
- プラットフォーム対応:WordPress(Yoast/Rank Math)・Next.js・Astroそれぞれに対応した実装方法がある
設定が完了したら、以下の無料ツールで検証・生成してください。