多言語ページ向けhreflangタグ生成ツール
hreflangタグ生成ツールは、言語別・地域別ページの一覧を、そのまま設置できるHTMLのlink要素へ変換します。各ロケールコードと絶対URLを入力し、必要に応じて共通のx-defaultを指定すると、個別のリンク情報と完全なHTMLブロックが得られます。構文の検証、一般的な大文字・小文字表記への正規化、重複の拒否、属性値の安全なエスケープを自動で行います。多言語サイト、国際商品カタログ、文書ポータル、代替ページを一貫して宣言する公開工程に適しています。
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
ロケール対応表を漏れなく作成します
同じ多言語・多地域グループに属する同等ページごとに、1行ずつ登録してください。各行にはロケールコードと、HTTPまたはHTTPSの絶対URLが必要です。1つのページですべての同一言語利用者に対応する場合は、jaやfrのような基本言語コードが適しています。価格、在庫、表記、法的条件などが市場ごとに異なる場合は、ja-JPやfr-CAのように地域を追加します。zh-Hansやsr-Latnのような4文字のスクリプトサブタグを使えば、表記体系も区別できます。本ツールでは、2文字または3文字の言語、任意のスクリプト、任意の2文字または3桁の地域を受け付けます。慣例に沿って大文字・小文字を整えるため、入力表記の揺れが不統一なマークアップにつながりません。現在のページも代替ページもすべて含めてください。hreflangグループは、外向きリンクだけでなく集合全体を記述するものです。各言語や市場に対応した、正規かつインデックス可能なURLを使用します。入力順は出力でも維持されるため、結果が安定し、バージョン管理でも確認しやすくなります。
x-defaultを目的に合わせて選びます
宣言した言語版や地域版のどれにも適合しない訪問者向けのページには、任意のx-default欄をご利用ください。言語選択ページ、国際向けトップページ、市場を選べる中立版などが一般的です。x-defaultを通常のロケール行には入力しないでください。専用欄を使うことで、重複や曖昧なフォールバックを防ぎ、ロケール別リンクの末尾へ必ず配置できます。適切な共通ページがない場合は、空欄のままでも問題ありません。返されるHTMLには、対応表の各行につき1つのlink要素が入り、指定時にはx-default要素が1つ加わります。グループ内の全HTMLページのheadへ完全なブロックを設置するか、アプリケーションがHTTP層で管理する場合は同等のLinkヘッダーを送信してください。相互参照も維持し、各ページから自分自身と同じ代替ページ群を示します。本ツールは宣言を生成しますが、公開先ページの相互タグ、インデックス可否、リダイレクトまでは確認しません。これらは別途クロールや監査でご確認ください。
出力を検証し継続的に管理します
不正なロケールコードはそのまま出力せず、エラーとして扱います。アンダースコア、前後の空白、言語部分の欠落、未対応の追加サブタグ、通常一覧内のx-defaultといった誤りを発見できます。正規化後の重複も拒否するため、en-usとen-USが競合するリンクになることはありません。URLはHTTPまたはHTTPSの絶対形式で指定してください。相対パスや別スキームでは、クロール対象の代替ページを正しく示せません。検証に通ったら、htmlフィールドをテンプレートへコピーするか、フレームワーク側でheadメタデータを描画する場合はlinks配列をご利用ください。各レコードには、正規化済みhreflang値、元のURL、完成済みタグが含まれます。翻訳ルートの変更、新市場の追加、既定ページの移転時にはブロックを再生成してください。対応表は一度きりの断片ではなく、保守対象のサイト設定として扱います。自動工程ではルート定義と入力を一緒に保存し、デプロイ時に出力を比較すると安全です。APIリクエストの料金は$0.002です。単発作業にはブラウザー、反復可能な公開処理には決定的なAPIが適しています。
活用例
地域別ストアを公開する
国別の商品ページに一貫した代替リンクを生成し、国際向け選択ページをx-defaultに設定できます。
翻訳済み文書を配信する
文書の言語別ルートを、各サイトビルドへ組み込める安定したHTMLブロックに変換します。
CMSメタデータを自動化する
編集者が翻訳ページを追加または移動した際に、構造化リンクからhead情報を設定できます。
よくある質問
どのロケールコード形式に対応していますか?
2文字または3文字の言語に、任意で4文字のスクリプトと2文字または3桁の地域を続けられます。例はja、zh-Hans、es-419です。
x-defaultも生成できますか?
はい。任意のx_default URLをご指定いただくと、言語別タグの後に追加されます。
重複ロケールが拒否されるのはなぜですか?
各hreflang値の宛先は1つにする必要があります。表記を正規化してからコードを比較します。
公開ページの相互リンクも確認しますか?
いいえ。ネットワークには接続せず、入力からマークアップのみ生成します。公開後は専用チェッカーやクロールで監査してください。
APIリクエストの料金はいくらですか?
APIリクエスト1回につき$0.002です。同じ決定的な生成処理をブラウザーでも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/web/hreflang-tags-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}'const res = await fetch("https://api.kit.forhosting.com/web/hreflang-tags-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/hreflang-tags-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/hreflang-tags-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"locales":[{"locale":"en","url":"https://example.com/en/product"},{"locale":"fr-FR","url":"https://example.com/fr/produit"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/hreflang-tags-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"locales": [
{
"locale": "en",
"url": "https://example.com/en/product"
},
{
"locale": "fr-FR",
"url": "https://example.com/fr/produit"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.hreflang_tags_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
timeout_sec | 30 |
max_crawl_pages | 25 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |