redirect
redirect 函式允許您將使用者重新導向至另一個 URL。redirect 可用於伺服器元件 (Server Components)、路由處理器 (Route Handlers) 和伺服器動作 (Server Actions)。
在串流上下文 (streaming context) 中使用時,它會插入一個 meta 標籤以在客戶端觸發重新導向。在伺服器動作中使用時,它會向呼叫者返回 303 HTTP 重新導向回應。其他情況下,則會返回 307 HTTP 重新導向回應。
如果資源不存在,您可以使用 notFound 函式 替代。
須知事項:
- 在伺服器動作和路由處理器中,
redirect應在try/catch區塊後呼叫。- 如果您希望返回 308 (永久) HTTP 重新導向而非 307 (暫時),可以使用
permanentRedirect函式 替代。
參數
redirect 函式接受兩個參數:
redirect(path, type)| 參數 | 類型 | 說明 |
|---|---|---|
path | string | 要重新導向的 URL。可以是相對或絕對路徑。 |
type | 'replace' (預設) 或 'push' (在伺服器動作中預設) | 指定重新導向的類型。 |
預設情況下,redirect 在伺服器動作 (Server Actions) 中會使用 push (在瀏覽器歷史堆疊中添加新項目),在其他地方則使用 replace (替換瀏覽器歷史堆疊中的當前 URL)。您可以透過指定 type 參數來覆蓋此行為。
type 參數在伺服器元件中使用時無效。
返回值
redirect 不返回任何值。
範例
伺服器元件
呼叫 redirect() 函式會拋出 NEXT_REDIRECT 錯誤,並終止所在路由區段的渲染。
import { redirect } from 'next/navigation'
async function fetchTeam(id) {
const res = await fetch('https://...')
if (!res.ok) return undefined
return res.json()
}
export default async function Profile({ params }) {
const team = await fetchTeam(params.id)
if (!team) {
redirect('/login')
}
// ...
}須知事項:
redirect不需要使用return redirect(),因為它使用了 TypeScript 的never類型。
客戶端元件
redirect 可透過伺服器動作在客戶端元件中使用。如果需要使用事件處理器來重新導向使用者,可以使用 useRouter 鉤子。
'use client'
import { navigate } from './actions'
export function ClientRedirect() {
return (
<form action={navigate}>
<input type="text" name="id" />
<button>Submit</button>
</form>
)
}'use client'
import { navigate } from './actions'
export function ClientRedirect() {
return (
<form action={navigate}>
<input type="text" name="id" />
<button>Submit</button>
</form>
)
}'use server'
import { redirect } from 'next/navigation'
export async function navigate(data: FormData) {
redirect(`/posts/${data.get('id')}`)
}'use server'
import { redirect } from 'next/navigation'
export async function navigate(data) {
redirect(`/posts/${data.get('id')}`)
}常見問題
為什麼 redirect 使用 307 和 308?
使用 redirect() 時,您可能會注意到它使用 307 表示暫時重新導向,308 表示永久重新導向。傳統上,302 用於暫時重新導向,301 用於永久重新導向,但許多瀏覽器在使用 302 時會將請求方法從 POST 改為 GET,無論原始請求方法為何。
以從 /users 重新導向至 /people 為例,如果您向 /users 發送 POST 請求以建立新使用者,並遵循 302 暫時重新導向,請求方法會從 POST 變為 GET。這並不合理,因為建立新使用者應向 /people 發送 POST 請求,而非 GET 請求。
307 狀態碼的引入確保了請求方法會保留為 POST。
302- 暫時重新導向,會將請求方法從POST改為GET307- 暫時重新導向,會保留請求方法為POST
redirect() 方法預設使用 307 而非 302 暫時重新導向,這意味著您的請求將始終保留為 POST 請求。
了解更多 關於 HTTP 重新導向的資訊。
版本歷史
| 版本 | 變更 |
|---|---|
v13.0.0 | 引入 redirect。 |