リライト (rewrites)
リライト (rewrites) を使用すると、受信リクエストパスを別の宛先パスにマッピングできます。
リライトはURLプロキシとして機能し、宛先パスをマスクするため、ユーザーがサイト上の位置を変更していないように見えます。一方、リダイレクト (redirects) は新しいページに再ルーティングされ、URLの変更が表示されます。
リライトを使用するには、next.config.js
でrewrites
キーを使用します:
リライトはクライアントサイドルーティングに適用され、上記の例では<Link href="/about">
にリライトが適用されます。
rewrites
は非同期関数で、source
とdestination
プロパティを持つオブジェクトの配列、または配列のオブジェクト(下記参照)を返すことが期待されます:
source
:String
- 受信リクエストのパターンdestination
:String
- ルーティングしたいパスbasePath
:false
またはundefined
- falseの場合、マッチング時にbasePathが含まれません。外部リライトのみに使用可能locale
:false
またはundefined
- マッチング時にロケールを含めないかどうかhas
-type
、key
、value
プロパティを持つhasオブジェクトの配列missing
-type
、key
、value
プロパティを持つmissingオブジェクトの配列
rewrites
関数が配列を返す場合、リライトはファイルシステム(ページと/public
ファイル)のチェック後、動的ルートの前に適用されます。rewrites
関数が特定の形状の配列オブジェクトを返す場合、Next.jsのv10.1
以降、この動作を変更し、より細かく制御できます:
知っておくと良い:
beforeFiles
のリライトは、ソースにマッチした後すぐにファイルシステム/動的ルートをチェックせず、すべてのbeforeFiles
がチェックされるまで続きます。
Next.jsのルートチェック順序は以下の通りです:
- headers がチェック/適用される
- redirects がチェック/適用される
beforeFiles
リライトがチェック/適用される- publicディレクトリの静的ファイル、
_next/static
ファイル、非動的ページがチェック/提供される afterFiles
リライトがチェック/適用され、これらのリライトのいずれかがマッチすると、各マッチ後に動的ルート/静的ファイルをチェックfallback
リライトがチェック/適用され、これらは404ページのレンダリング前、動的ルート/すべての静的アセットのチェック後に適用されます。getStaticPaths
でfallback: true/'blocking'を使用する場合、next.config.js
で定義されたfallback
rewrites
は実行_されません_。
リライトパラメータ
リライトでパラメータを使用する場合、destination
でパラメータが使用されていない場合、パラメータはデフォルトでクエリに渡されます。
パラメータがdestinationで使用されている場合、パラメータは自動的にクエリに渡されません。
destinationですでにパラメータが使用されている場合でも、destination
でクエリを指定することで、手動でパラメータをクエリに渡すことができます。
知っておくと良い: Automatic Static Optimization からの静的ページや prerendering からのパラメータは、ハイドレーション後にクライアント側で解析され、クエリで提供されます。
パスマッチング
パスマッチングが許可されています。例えば/blog/:slug
は/blog/hello-world
にマッチします(ネストされたパスは不可):
ワイルドカードパスマッチング
ワイルドカードパスにマッチさせるには、パラメータの後に*
を使用します。例えば/blog/:slug*
は/blog/a/b/c/d/hello-world
にマッチします:
正規表現パスマッチング
正規表現パスにマッチさせるには、パラメータの後に正規表現を括弧で囲みます。例えば/blog/:slug(\\d{1,})
は/blog/123
にマッチしますが、/blog/abc
にはマッチしません:
以下の文字(
, )
, {
, }
, [
, ]
, |
, \
, ^
, .
, :
, *
, +
, -
, ?
, $
は正規表現パスマッチングに使用されるため、source
で特殊値として使用されない場合は、\\
を前に付けてエスケープする必要があります:
ヘッダー、クッキー、クエリのマッチング
リライトをヘッダー、クッキー、またはクエリ値もマッチする場合にのみ適用するには、has
フィールドを使用します。またはマッチしない場合に適用するにはmissing
フィールドを使用します。リライトが適用されるには、source
とすべてのhas
アイテムがマッチし、すべてのmissing
アイテムがマッチしない必要があります。
has
とmissing
アイテムは以下のフィールドを持つことができます:
type
:String
-header
、cookie
、host
、またはquery
のいずれかでなければなりませんkey
:String
- マッチ対象の選択されたタイプのキーvalue
:String
またはundefined
- チェックする値。undefinedの場合、任意の値がマッチします。正規表現のような文字列を使用して値の特定の部分をキャプチャできます。例えば、first-(?<paramName>.*)
という値をfirst-second
に使用すると、second
は:paramName
としてdestinationで使用可能になります
外部URLへのリライト
例
リライトを使用して外部URLにリライトできます。これはNext.jsを段階的に採用する場合に特に便利です。以下は、メインアプリの/blog
ルートを外部サイトにリダイレクトするリライトの例です。
trailingSlash: true
を使用している場合、source
パラメータに末尾のスラッシュを挿入する必要もあります。宛先サーバーも末尾のスラッシュを期待している場合は、destination
パラメータにも含める必要があります。
Next.jsの段階的採用
Next.jsルートをすべてチェックした後、既存のウェブサイトへのプロキシにフォールバックさせることもできます。
この方法では、より多くのページをNext.jsに移行する際にリライト設定を変更する必要がありません
basePathサポート付きリライト
basePath
サポートをリライトと共に使用する場合、各source
とdestination
には、リライトにbasePath: false
を追加しない限り、自動的にbasePath
がプレフィックスとして追加されます:
バージョン履歴
バージョン | 変更点 |
---|---|
v13.3.0 | missing 追加 |
v10.2.0 | has 追加 |
v9.5.0 | ヘッダーサポート追加 |