Orbit
リダイレクトとリライトの設定
Orbit has a built-in redirect and rewrite engine that runs before your project is asked for anything, configured either in KPanel or as a file in your repository. This guide covers both, the pattern…
Orbitには、プロジェクトがリクエストされる前に実行される組み込みリダイレクトおよびリライトエンジンがあります。KPanelまたはリポジトリ内のファイルで設定できます。本ガイドでは、両方の設定方法、パターン構文とそのキャプチャ、ルールの順序、制限、および予期しない動作をカバーしています。
ルールを設定する場所
2つの場所があり、固定の順序で評価されます。
- KPanelで設定。 Orbitでプロジェクトを開き、Settingsに移動して、環境のredirects and rewritesセクションまでスクロールします。各環境には独立したルールセットがあるため、本番環境とステージング環境は別々に設定します。
- リポジトリ内で、
kaps.jsonファイルとして設定。 これについては後で説明します。
パネルルールが最初に評価されます。マッチするものがなければ、kaps.jsonルールが試されます。

KPanelでルールを追加する
- Add ruleをクリック。
- source(受信リクエストをマッチングするパスパターン)を入力。プレースホルダーは予想される2つの形式を示しています:
/old-path or /blog/:slug。 - destinationを入力。プレースホルダーは
/new-path or https://...を示しているため、ローカルパスと完全な外部URLの両方が有効です。 - ルールタイプを選択:
- 301 Permanent: URLは恒久的に移動。ブラウザと検索エンジンはこれをキャッシュします。
- 302 Temporary: 一時的に移動、キャッシュされない。キャンペーンと実験に使用。
- Rewrite: ブラウザのアドレスバーのURLを変更せずに宛先パスを提供。
- Save rulesをクリック。
ルールは次のデプロイメントから有効になり、即座には有効になりません。ルールを保存しても、現在ライブのデプロイメントが提供するものは変わりません。保存後に再デプロイしてください。そうしないと、ルールが機能していないように見えます。
301はブラウザによってキャッシュされ、非常に長い期間キャッシュされることがあり、サーバーからそれをクリアすることはできません。移動が恒久的であるか確実でない場合は、まず302を使用し、確実になったら301に切り替えます。高トラフィックパスでこれを誤ると、本当に取り返しがつきません。
ソースパスパターン
| パターン | マッチ対象 | キャプチャ |
|---|---|---|
/old-page | 正確に/old-page | なし |
/blog/* | /blog/で始まるもの | パスの残り部分。宛先で*として参照 |
/posts/:id | /posts/に加えて1つのパスセグメント | そのセグメント(:idとして) |
/files/:rest* | /files/に加えてその後のすべてのもの(スラッシュを含む) | 全残り部分(:restとして) |
:idと:rest*の違いが重要です。名前付きパラメータは単一セグメントをマッチングし、次のスラッシュで停止します。スプラットは残りのすべてをマッチング(スラッシュを含む)。
宛先でキャプチャを使用する
名前付きパラメータを名前で参照し、ベアワイルドカードを*として参照:
| ソース | 宛先 | 結果 |
|---|---|---|
/blog/:slug | /articles/:slug | /blog/hello-worldは/articles/hello-worldになる |
/docs/:rest* | /help/:rest* | /docs/a/b/cは/help/a/b/cになる |
/old/* | /new/* | /old/a/bは/new/a/bになる |
ルールの順序
ルールはリストの上から下へテストされ、最初にマッチしたものが有効です。ルールがマッチングすると、それ以降のルールは考慮されません。パネルはリストの下に「ルールは順序でテストされます。最初にマッチしたものが有効です」と表示します。
具体的なルールを一般的なルールの上に配置してください。/blog/*ルールが/blog/2023/:slugの上に配置されると、より具体的なルールが処理することになっていたすべてのリクエストを引き継ぎ、具体的なルールが単に機能していないように見えます。
ルールがマッチしない場合、リクエストは通常通り提供されます。
一般的な使用例
ページの名前変更
/about-usを/aboutに名前変更し、古いリンクが機能し続けるようにしたい。
- ソース:
/about-us - 宛先:
/about - タイプ: 301 Permanent
セクション全体の移動
ブログが/news/:slugから/blog/:slugに移動しました。
- ソース:
/news/:slug - 宛先:
/blog/:slug - タイプ: 301 Permanent
APIパスを無音でプロキシ
/api/v1/*を別の内部パスから提供し、変更を公開したくない。
- ソース:
/api/v1/:path* - 宛先:
/api/internal/:path* - タイプ: Rewrite
一時的なホールディングページ
- ソース:
/checkout - 宛先:
/maintenance - タイプ: 302 Temporary
トラフィックを別のドメインに送信
宛先は絶対URLである場合があるため、ルールは完全に異なるサイトを指すことができます。
- ソース:
/shop/:rest* - 宛先:
https://shop.example.com/:rest* - タイプ: 301 Permanent
kaps.jsonでのコード化による設定
ルールはパネルの代わりにリポジトリに配置できます。kaps.jsonファイルを追加し、ビルドがそれをoutput directoryにコピーすることを確認してください。Orbitはリポジトリルートではなく、ビルドされたアーティファクトのルートから読み取るためです。
{
"redirects": [
{ "source": "/about-us", "destination": "/about", "permanent": true },
{ "source": "/news/:slug", "destination": "/blog/:slug", "permanent": true },
{ "source": "/promo", "destination": "/spring-sale", "permanent": false }
],
"rewrites": [
{ "source": "/api/v1/:path*", "destination": "/api/internal/:path*" }
],
"headers": [
{
"source": "/*",
"headers": [
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" }
]
}
]
}
permanent: trueは301を生成し、permanent: falseは302を生成します。省略すると301になります。
kaps.jsonは静的デプロイメントのみに適用されます。Server modeがオンの場合、アプリが独自のルーティングを処理し、ファイルは無視されます。また、環境のパネルルールがマッチングに失敗した後にのみ評価されるため、パネルルールは同じパスのファイルルールに常に勝ちます。
ルールがコードに属する場合はkaps.jsonを使用します。これにより、プルリクエストで確認でき、ロールバックで移動します。パネルは、デプロイせずにルールをライブにする必要があるときに使用します。両方の場所で同じルールを維持しないでください: パネルルールが常に有効になり、ファイルルールが無視されているように見えます。実際に無視されています。
制限
- 環境ごとに最大100個のリダイレクトおよびリライトルール、および
kaps.json内に100個。 - 環境ごとに最大200個のカスタムヘッダールール。
制限を超えるルールはエラーが発生せずに無音でドロップされるため、制限をはるかに下回るようにしてください。
カスタムレスポンスヘッダー
リダイレクトとともに、各環境のSettings内にレスポンスヘッダーセクションがあり、マッチングパスにHTTPヘッダーを挿入します。これは同じパスパターン構文を使用し、HSTS、CSP、no-embed、no-sniff、referrer policy、CORSのクイック追加プリセットがあります。
リダイレクトとは異なり、すべてのマッチングヘッダールールが適用され、最初のものだけではなく、後のルールが同じヘッダーを設定する場合は前のものを上書きします。Content-Length、Transfer-Encoding、およびConnectionはブロックされています。それらを設定するとレスポンスが破損するためです。
それに依存する前に知る価値がある動作
クエリ文字列はリダイレクト全体では実行されません。 ルールはリクエストがクエリ文字列を持つかどうかに関係なくマッチングしますが、宛先はテンプレートとキャプチャされたパスセグメントからのみ構築されます。/old?utm_source=emailへのリクエストは/newにリダイレクトされ、パラメータはドロップされます。追跡パラメータが生き残ることに依存する場合は、代わりにエッジ関数でリダイレクトを処理してください。そこでは宛先URLを完全に制御できます。
- ルールはパスのみをマッチングします。 フラグメント(
#section)はサーバーに届きません。ブラウザはリダイレクト後にそれらを再度アタッチします。 - 存在しないパスへのリライトは404を生成します。元のパスに無音で落ちるのではなく。リライトターゲットはビルド出力に存在する必要があります。
- ルールはプロジェクトがなにかリクエストされる前に実行されます。そのため、静的ファイルとサーバーモードリクエストの両方に適用されます。
- 各環境は独立しています。 本番環境のルールはステージング環境またはプレビューに適用されません。意図的にコピーしてください。
ルールを削除する
ルール行のゴミ箱アイコンをクリックし、Save rulesをクリックして変更を適用します。追加する場合と同様に、変更は次のデプロイメントから有効になります。
代わりにエッジ関数を使用する場合
リダイレクトエンジンはパス間ルールを処理します。ルールエンジンが表現できないロジックが必要な場合は、エッジ関数を使用してください: ヘッダーまたはクッキーへの分岐、クエリパラメータの保持または書き換え、重み付きA/Bルーティング、または条件付きのすべて。