リダイレクトマップを検証
リダイレクト表は一行ずつ見ると正しくても、クローラーが抜けられないループや、一つの転送元に二つの転送先が割り当てられている場合があります。CSVまたはTSVを貼り付けると、公開前にマップ全体を有向グラフとして解析できます。結果は各問題を元のレコードに結び付け、曖昧でない経路だけを終点までたどります。終点が存在しない場合は、推測したURLを表示せず、その理由を明示します。
無料で実行
トラフィックを切り替える前に計画を確認します
リダイレクトの不備は、設定を公開した後よりも、マップがファイルの段階で直すほうが安全です。この検証では各レコードのsource、target、任意のHTTPステータスを読み取り、サーバー設定が作る経路を再現します。URLやパスの形式不備、未対応のステータス、一つの転送元に異なる転送先がある状態、同じ場所への自己転送を報告します。解析中にテスト環境や本番環境へ通信せず、入力ファイルも変更しません。そのため、未公開パスを外部へ送らずに、移行レビュー、公開チェックリスト、自動品質検査へ組み込めます。
チェーン、ループ、終点を区別します
利用できる各sourceから、次のsourceとして登録されていないtargetへ到達するまで経路をたどります。一回だけの転送はdirectです。二回以上続く経路はchainとして、ホップ数、完全なpath、終点のfinal_targetを返しますので、意図を確認した上で直接転送へ整理できます。一方、cycleには終点がありません。二つのページが往復する場合、より長い循環の場合、途中から循環へ入る場合のいずれも、繰り返した経路を示し、final_targetは出力しません。競合する転送元と自己転送にも、架空の終点を補いません。
CSVとURLを保守的な規則で扱います
区切り文字にはカンマ、セミコロン、タブ、縦棒を使用できます。引用符で囲んだフィールド、二重引用符のエスケープ、値の前後の空白にも対応します。自動判定はsourceとtargetを含む見出し行を優先し、特殊な書き出しでは区切り文字を明示できます。転送元と転送先にはHTTPまたはHTTPSの絶対URL、あるいはスラッシュで始まるパスを指定します。両方を同じグラフで比較する場合はbase_urlを設定してください。パスの大文字小文字、クエリ、エンコード済み文字は保持し、別のURLを強引に統合しません。バイト数と行数の上限も解析前に適用します。
活用例
サイト移行前のレビュー
DNS、テンプレート、サーバー規則を変更する前に、制作会社、CMS、クロール一覧から受け取った転送表を確認できます。
継続的な品質検査
リリースごとに同じ決定的な検査を実行し、競合する転送元やループが本番設定へ入るのを防げます。
古いリダイレクトチェーンの短縮
報告された経路、ホップ数、終点を確認し、複数段の転送をレビュー済みの直接転送へ置き換えられます。
よくある質問
転送元や転送先のURLへアクセスしますか?
いいえ。入力文字列をオフラインのグラフとして解析します。実際の転送を追跡せず、HTTP応答や転送先の存在を確認せず、未公開パスをネットワークへ送信しません。
リダイレクトループがある場合はどうなりますか?
該当する解決結果をcycleとして、繰り返した経路を表示します。ループには終点がないため、final_targetは意図的に含めません。
どのHTTPステータスを使用できますか?
任意のコード列の名前は正確に`status`とする必要があり、`code`と`status_code`は認識されません。301、302、307、308を指定できます。空欄は301として扱い、それ以外の値は該当行のエラーとして報告します。
相対パスと絶対URLを混在させられますか?
可能です。ただし同じグラフとして比較する場合はbase_urlを指定してください。指定しない場合、パスのドメインを推測できないため警告を表示します。
無料で利用できますか?
ブラウザ版はパソコンとスマートフォンでローカルに無料実行できます。API自動化も同じ契約を使用し、公開料金$0.002をKITの前払い残高から使用します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/seo/redirect-map-validate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"mapping":"source,target,status\n/old-page,/new-page,301\n/new-page,/final-page,301"}'const res = await fetch("https://api.kit.forhosting.com/seo/redirect-map-validate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"mapping": "source,target,status\n/old-page,/new-page,301\n/new-page,/final-page,301"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/redirect-map-validate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"mapping": "source,target,status\n/old-page,/new-page,301\n/new-page,/final-page,301"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/redirect-map-validate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"mapping":"source,target,status\\n/old-page,/new-page,301\\n/new-page,/final-page,301"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"mapping":"source,target,status\n/old-page,/new-page,301\n/new-page,/final-page,301"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/redirect-map-validate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"mapping": "source,target,status\n/old-page,/new-page,301\n/new-page,/final-page,301"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.redirect_map_validate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_bytes | 1048576 |
max_rows | 10000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |