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
- 匹配時是否不包含 locale。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,這些會在渲染 404 頁面之前和檢查所有動態路由/靜態資源之後應用。如果您在getStaticPaths
中使用 fallback: true/'blocking',則next.config.js
中定義的fallback
rewrites 不會 執行。
Rewrite 參數
當在 rewrite 中使用參數時,如果 destination
中沒有使用任何參數,則參數將預設傳遞在查詢中。
如果在 destination
中使用了參數,則不會自動將任何參數傳遞在查詢中。
如果 destination
中已經使用了參數,您仍然可以通過在 destination
中指定查詢來手動傳遞參數。
須知:來自 Automatic Static Optimization 或 prerendering 的靜態頁面的 rewrite 參數將在 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 特別有用。以下是將您的主應用程式的 /blog
路由重定向到外部網站的 rewrite 範例。
如果您使用 trailingSlash: true
,您還需要在 source
參數中插入尾部斜線。如果目標伺服器也期望尾部斜線,則應在 destination
參數中包含它。
逐步採用 Next.js
您也可以讓 Next.js 在檢查所有 Next.js 路由後回退到代理現有網站。
這樣,當您將更多頁面遷移到 Next.js 時,您不需要更改 rewrites 配置。
支援 basePath 的 Rewrites
當與 rewrites 一起使用 basePath
支援 時,每個 source
和 destination
會自動加上 basePath
前綴,除非您在 rewrite 中添加 basePath: false
:
支援 i18n 的 Rewrites
當與 rewrites 一起使用 i18n
支援 時,每個 source
和 destination
會自動加上前綴以處理配置的 locales
,除非您在 rewrite 中添加 locale: false
。如果使用 locale: false
,您必須在 source
和 destination
前加上 locale 才能正確匹配。
版本歷史
版本 | 變更內容 |
---|---|
v13.3.0 | 新增 missing 。 |
v10.2.0 | 新增 has 。 |
v9.5.0 | 新增標頭。 |