ページネーションのrel prev・nextタグ確認
ページネーションrelタグ確認ツールは、順序付きのページ群が一貫したチェーンを形成しているかを検証します。各ページのURLと、rel=prevおよびrel=nextタグに記載されたリンク先を入力してください。必要なリンクの欠落、端点の余分なリンク、自己参照、URLの重複、ページを飛ばすリンク、誤った隣接ページへのリンクを特定します。ページへのアクセスは行わず、完全に決定的な比較を実施するため、ビルド検査、クローラーの出力確認、再現可能なテクニカルSEO監査に適しています。
無料で実行
想定する順序でページ群をご指定ください
検索エンジンと訪問者にシリーズの先頭として認識させるページから始め、その後に続くすべてのページを順番に追加してください。各レコードには、ページの絶対URLと、rel=prevおよびrel=nextタグで宣言されているリンク先を入力します。本ツールは、配列の並びをお客様が提示した正規の順序として扱います。そのため、期待される関係は明確です。2ページ目は1ページ目を前のページとして示し、1ページ目は2ページ目を次のページとして示す必要があり、この規則がシリーズ全体で続きます。先頭レコードには前のページがないためprevを省略し、末尾レコードには次のページがないためnextを省略してください。テンプレートが出力するはずだったURLではなく、実際のタグに記載されたリンク先をご使用ください。正確な入力により、末尾スラッシュの違い、別のクエリパラメーター、2ページ目から4ページ目へ直接飛ぶリンクなど、見落としやすい差異も明らかになります。ページネーション関係を確認できないため、2件未満のリストは無効な入力として拒否されます。
報告される各問題をご確認ください
有効な結果とは、隣接するすべての組み合わせが双方向で一致している状態です。前のページは次のページを指し、次のページは前のページを指します。missing_linkは、入力された順序から必要となる関係が欠けていることを示します。unexpected_linkは、先頭ページにprevがある場合、または末尾ページにnextがある場合に表示され、送信されたシリーズの外側までチェーンが延びていることを表します。mismatched_linkは、直近の想定ページとは異なるリンク先を示し、ページの飛び越し、古いテンプレート値、レコードの順序違いなどを発見できます。self_linkは、別のページではなく同じページ自身を指している状態です。URLの重複は、周辺のタグ文字列が一致して見える場合でも、提示された順序を曖昧にするため個別に報告されます。各問題には、1から始まるページ位置、URL、対象フィールド、期待するリンク先、実際のリンク先が含まれます。本ツールはURLへアクセスせず、応答の有無も判定しません。ご提供いただいた関係のみを評価します。
SEO品質管理の工程で結果をご活用ください
レンダリング済みページ、クローラーのエクスポート、またはテンプレートテストからリンク要素を抽出した後に、この検査を実行してください。継続的インテグレーションでは、ページネーションテンプレートを公開する前にvalidがtrueであることを必須にすると、結果をリリース条件として利用できます。監査時には、問題一覧をクロール時点の記録とともに保存すると、開発担当者がサイトを再度クロールせずに、不整合となった関係を正確に再現できます。前後の空白を除去した後も、比較は意図的に厳密です。クエリ文字列の正規化、フラグメントの削除、HTTPとHTTPSの同一視、末尾スラッシュの同一視は行いません。これらの変換は、実際の正規化問題を隠すおそれがあるためです。元のタグまたは入力順序を修正し、問題数がゼロになるまで同じレコードで再実行してください。ブラウザーツールは手動確認に便利で、自動リクエストは1回につき$0.002で同じ決定的な構造を返します。完全な監査には、ステータスコード、canonicalタグ、インデックス登録可否、レンダリングHTMLの検証も別途組み合わせてください。
活用例
公開前にテンプレートを検査
生成されたタグのリンク先をビルド検査へ渡し、隣接ページが相互に参照していない場合はデプロイを停止します。
クローラーの出力を確認
抽出したprev・nextのリンク先を順序付きレコードへ変換し、飛び越し、古いリンク、余分なリンクを特定します。
移行後の構造を検証
ルート、クエリパラメーター、末尾スラッシュ規則の変更後も、書き換えたURLが想定どおりのチェーンを形成するか確認します。
よくある質問
入力したURLへアクセスしますか?
いいえ。ネットワークリクエストは行わず、ご指定の順序付きURLとrelタグのリンク先だけを検証します。
1ページだけを入力するとどうなりますか?
ページネーション関係の検証には2ページ以上が必要なため、無効な入力としてリクエストを拒否します。
先頭ページにrel=prevは必要ですか?
いいえ。先頭ページではprevを省略してください。空ではない前方リンク先がある場合は、余分なリンクとして報告します。
同等に見えるURLは正規化されますか?
いいえ。前後の空白を除く以外はURLを厳密に比較し、正規化の差異が隠れないようにします。
有効という結果は何を証明しますか?
入力されたタグが、入力順序と双方向で一致することを証明します。ページの応答、タグの実際の描画、インデックス登録可否までは証明しません。
自動検査の料金はいくらですか?
APIリクエスト1回につき$0.002です。ブラウザー版は対話的な検査のためにローカルで実行されます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/seo/pagination-tags-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}'const res = await fetch("https://api.kit.forhosting.com/seo/pagination-tags-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/pagination-tags-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/pagination-tags-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pages":[{"url":"https://example.com/articles?page=1","next":"https://example.com/articles?page=2"},{"url":"https://example.com/articles?page=2","prev":"https://example.com/articles?page=1","next":"https://example.com/articles?page=3"},{"url":"https://example.com/articles?page=3","prev":"https://example.com/articles?page=2"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/pagination-tags-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"pages": [
{
"url": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=2"
},
{
"url": "https://example.com/articles?page=2",
"prev": "https://example.com/articles?page=1",
"next": "https://example.com/articles?page=3"
},
{
"url": "https://example.com/articles?page=3",
"prev": "https://example.com/articles?page=2"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.pagination_tags_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |