rewrites
Rewrites 允許您將傳入的請求路徑映射到不同的目標路徑。
Rewrites 作為 URL 代理並遮罩目標路徑,使使用者看起來像是沒有改變他們在網站上的位置。相比之下,redirects 會重新路由到新頁面並顯示 URL 變更。
要使用 rewrites,您可以在 next.config.js
中使用 rewrites
鍵:
Rewrites 會應用於客戶端路由,在上述範例中,<Link href="/about">
將會套用 rewrite。
rewrites
是一個非同步函式,預期返回一個陣列或包含陣列的物件(見下文),其中包含具有 source
和 destination
屬性的物件:
source
:String
- 傳入的請求路徑模式。destination
:String
- 您想要路由到的路徑。basePath
:false
或undefined
- 如果為 false,則在匹配時不會包含 basePath,僅可用於外部 rewrites。locale
:false
或undefined
- 是否在匹配時不包含語言環境。has
是一個包含type
、key
和value
屬性的 has 物件 陣列。missing
是一個包含type
、key
和value
屬性的 missing 物件 陣列。
當 rewrites
函式返回一個陣列時,rewrites 會在檢查檔案系統(頁面和 /public
檔案)之後、動態路由之前應用。當 rewrites
函式返回具有特定形狀的物件陣列時,可以更改並更精細地控制此行為,從 Next.js 的 v10.1
開始:
須知:
beforeFiles
中的 rewrites 在匹配 source 後不會立即檢查檔案系統/動態路由,它們會繼續檢查直到所有beforeFiles
都被檢查完畢。
Next.js 路由的檢查順序如下:
- 檢查/應用 headers
- 檢查/應用 redirects
- 檢查/應用
beforeFiles
rewrites - 檢查/提供來自 public 目錄 的靜態檔案、
_next/static
檔案和非動態頁面 - 檢查/應用
afterFiles
rewrites,如果匹配其中一個 rewrites,我們會在每次匹配後檢查動態路由/靜態檔案 - 檢查/應用
fallback
rewrites,這些 rewrites 在渲染 404 頁面之前和檢查動態路由/所有靜態資源之後應用。如果您在getStaticPaths
中使用 fallback: true/'blocking',則next.config.js
中定義的fallback
rewrites 不會 執行。
Rewrite 參數
在 rewrite 中使用參數時,當 destination
中未使用任何參數時,參數將預設傳遞在查詢中。
如果在 destination 中使用了參數,則不會自動將任何參數傳遞在查詢中。
如果 destination 中已經使用了參數,您仍然可以通過在 destination
中指定查詢來手動傳遞參數。
須知:來自 Automatic Static Optimization 或 prerendering 的靜態頁面參數將在 hydration 後在客戶端解析並提供在查詢中。
路徑匹配
允許路徑匹配,例如 /blog/:slug
將匹配 /blog/hello-world
(無嵌套路徑):
萬用字元路徑匹配
要匹配萬用字元路徑,您可以在參數後使用 *
,例如 /blog/:slug*
將匹配 /blog/a/b/c/d/hello-world
:
正則表達式路徑匹配
要匹配正則表達式路徑,您可以將正則表達式括在參數後的括號中,例如 /blog/:slug(\\d{1,})
將匹配 /blog/123
但不匹配 /blog/abc
:
以下字符 (
, )
, {
, }
, [
, ]
, |
, \
, ^
, .
, :
, *
, +
, -
, ?
, $
用於正則表達式路徑匹配,因此當在 source
中作為非特殊值使用時,必須通過在它們前面添加 \\
來轉義:
標頭、Cookie 和查詢匹配
要僅在標頭、cookie 或查詢值也匹配 has
字段或不匹配 missing
字段時匹配 rewrite,可以使用 has
或 missing
。source
和所有 has
項目必須匹配,且所有 missing
項目必須不匹配,才能應用 rewrite。
has
和 missing
項目可以具有以下字段:
type
:String
- 必須是header
、cookie
、host
或query
之一。key
:String
- 要匹配的所選類型的鍵。value
:String
或undefined
- 要檢查的值,如果為 undefined,則任何值都將匹配。可以使用類似正則表達式的字符串來捕獲值的特定部分,例如,如果值first-(?<paramName>.*)
用於first-second
,則second
可以在 destination 中使用:paramName
。
重寫到外部 URL
範例
Rewrites 允許您重寫到外部 URL。這對於逐步採用 Next.js 特別有用。以下是一個 rewrite 範例,用於將您主應用程式的 /blog
路由重定向到外部網站。
如果您使用 trailingSlash: true
,您還需要在 source
參數中插入尾部斜線。如果目標伺服器也期望尾部斜線,則應將其包含在 destination
參數中。
逐步採用 Next.js
您也可以讓 Next.js 在檢查所有 Next.js 路由後回退到代理現有網站。
這樣,當您將更多頁面遷移到 Next.js 時,您無需更改 rewrites 配置。
支援 basePath 的 Rewrites
當與 rewrites 一起使用 basePath
支援 時,每個 source
和 destination
會自動加上 basePath
前綴,除非您在 rewrite 中添加 basePath: false
:
版本歷史
版本 | 變更 |
---|---|
v13.3.0 | 新增 missing 。 |
v10.2.0 | 新增 has 。 |
v9.5.0 | 新增標頭支援。 |