301・302用.htaccessリダイレクトルールを生成
正規表現を手作業で書かずに、リダイレクト一覧をそのまま貼り付けられるApacheルールへ変換できます。移転元と移転先の組み合わせを入力し、恒久的な301または一時的な302を選ぶと、個別のRewriteRule行と一括した.htaccessブロックを取得できます。移転元の特殊文字は安全にエスケープされ、同一サイト内のパスと絶対HTTP・HTTPS URLの両方を移転先として使用できます。入力順も維持され、不完全な組み合わせは壊れたリダイレクトになる前にエラーとして通知されます。
無料で実行
明確なリダイレクト一覧をご用意ください
移転するアドレスごとに1行をご用意ください。.htaccessリダイレクトルール生成ツールでは、from欄に移転元、to欄に移転先を入力します。移転元は/old-products/widgetのように、スラッシュで始まるルート相対パスである必要があります。ApacheのRewriteRuleが照合するのはURLのパス部分であり、クエリー文字列やフラグメントではないため、移転元にはそれらを含めないでください。移転先には、同じサイトのルート相対パス、または別ホストへ移動する場合の完全なHTTP・HTTPS URLを指定できます。URLに特殊文字が必要な場合は、実際の空白ではなくパーセントエンコードをご使用ください。Apacheに評価させたい順番のまま行を並べてください。生成されるルールはパス全体を照合するため多くの競合を避けられますが、順序を意識すると、設定の確認や保守、移行表との照合が容易になります。各行は検証され、fromまたはtoが欠けている場合は、該当する組み合わせを示して処理を停止します。
恒久的か一時的かをお選びください
移転が恒久的で、検索エンジン、ブラウザー、後続システムに新しいアドレスを認識させる場合は301をお選びください。短期キャンペーン、メンテナンス期間、管理されたテストなど、一時的な変更には302をご使用ください。選択したステータスは1回のリクエストに含まれる全組み合わせへ一律に適用されるため、異なる種類が混在した表から意図しない動作が生成されることを防げます。各行には、アンカー付きの移転元パターン、検証済みの移転先、ApacheフラグR=301,LまたはR=302,Lが含まれます。アンカーによって曖昧な部分一致ではなくパスの完全一致となり、Lによってルール適用後の現在の書き換え処理が終了します。また、移転元にある正規表現用の記号はエスケープされるため、文字どおりのピリオドや括弧が別のアドレスへ誤って一致しません。サーバーが.htaccessを読み込み、mod_rewriteが有効かご確認ください。本ツールはディレクティブを作成しますが、Apache環境の検査や変更は行いません。
生成したブロックを設置して確認してください
移転元パスを処理するサイト範囲の適切な.htaccessファイルへ、htaccessの値をコピーしてください。出力はRewriteRule行のみです。既存設定ですでにRewriteEngine Onが指定されている場合があるため、書き換えが未有効の場合だけ別途追加してください。編集前に現在の設定をバックアップし、可能であればステージング環境でテストしてください。すべての旧URLへアクセスし、応答ステータス、Locationヘッダー、最終ページ、予期しないリダイレクトチェーンがないことをご確認ください。リダイレクトされないはずの似たURLもテストすると、移転先の成功確認だけでは分からない設定同士の影響を発見できます。ローカルのApacheルールは、前後のディレクティブ、VirtualHost設定、プロキシ層、CMSの書き換え処理から影響を受ける場合があります。自動処理向けに、APIは個別ルールの配列と改行で連結したブロックの両方を返します。1回のリクエストは$0.002です。同じ決定的な生成処理をブラウザーでも利用でき、単発の移行にも適しています。
活用例
刷新したサイトを公開する場合
新しい情報設計の公開前に、承認済みの旧パスと新パスの対応表を正確な恒久リダイレクトへ変換できます。
期間限定キャンペーンを実施する場合
恒久的な置換として扱わないランディングページの短期移動に、一貫した302ルールを作成できます。
一部のページを別ドメインへ移す場合
移転元を明示して確認しやすく保ちながら、絶対HTTPS URLを移転先とするルールを生成できます。
よくある質問
料金はいくらですか?
APIリクエスト1回あたり$0.002です。このページのブラウザー上でも生成処理をご利用いただけます。
出力にRewriteEngine Onは含まれますか?
含まれません。既存の.htaccessですでに書き換えエンジンが有効な場合が多いため、RewriteRule行だけを出力します。
1回のリクエストで301と302を混在できますか?
できません。選択した種類がすべての組み合わせに適用されます。恒久ルールと一時ルールは別々に生成してください。
移転先に別ドメインを指定できますか?
はい。認証情報を含まない絶対HTTP・HTTPS URL、または現在のサイトのルート相対パスを指定できます。
組み合わせが不完全な場合はどうなりますか?
処理を停止し、該当する組み合わせと、fromまたはtoのどちらが欠けているかを入力エラーとして示します。
移転元のパスにクエリー文字列を含められますか?
含められません。RewriteRuleはパスを照合します。クエリーの照合には、本ツールの範囲外となる追加のRewriteCondが必要です。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/web/htaccess-redirect-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}'const res = await fetch("https://api.kit.forhosting.com/web/htaccess-redirect-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/htaccess-redirect-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/htaccess-redirect-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/htaccess-redirect-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.htaccess_redirect_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 500 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |