Next.js 中 middleware 中間件使用方式
從 Next.js 16 開始,中間件Middleware更名為代理(Proxy),以更好地體現(xiàn)其用途。其功能保持不變。
1. 什么是 Middleware?
- Middleware 是運(yùn)行在 請求到達(dá)路由之前 的一個函數(shù)。
- 它位于 用戶請求 和 路由處理器 之間,可以對請求進(jìn)行 攔截、修改、重定向、鑒權(quán) 等操作。
- 本質(zhì)上是運(yùn)行在 Edge Runtime(輕量、無 Node.js API,僅 Web API)。
2. Middleware 的文件位置
- 必須放在項(xiàng)目根目錄的
middleware.ts或middleware.js文件中。 - 作用范圍取決于你在
matcher中定義的路徑。
project/ ├── app/ ├── middleware.ts ?? 全局 Middleware └── package.json
3. 常見場景
(1) 權(quán)限控制 / 鑒權(quán)
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(request: NextRequest) {
// 打印請求路徑
console.log("請求路徑:", request.nextUrl.pathname);
// 例子:未登錄就重定向到 /auth/signin
const isLoggedIn = request.cookies.get("next-auth.session-token");
console.log("是否登錄:", isLoggedIn);
if (!isLoggedIn && request.nextUrl.pathname.startsWith("/dashboard")) {
return NextResponse.redirect(new URL("/auth/signin", request.url));
}
// 默認(rèn)放行
return NextResponse.next();
}
// 匹配規(guī)則:只在 /dashboard 下生效
export const config = {
matcher: ["/dashboard/:path*"]
};
matcher: ["/dashboard/:path*"] 表示 /dashboard 下的所有路徑,包括: /dashboard、/dashboard/about、/dashboard/blog/123 等。都會觸發(fā) middleware 函數(shù)。
上面的代碼含義:如果用戶未登錄,并且請求路徑以 /dashboard 開頭,就重定向到 /auth/signin。
如圖未登錄:

如圖已登錄:

(2) 國際化 / 路由重寫
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// 如果路徑?jīng)]有語言前綴,重寫到默認(rèn)語言
if (!pathname.startsWith("/en") && !pathname.startsWith("/zh")) {
const url = request.nextUrl.clone();
url.pathname = `/en${pathname}`;
return NextResponse.rewrite(url);
}
return NextResponse.next();
}
(3) A/B 測試
export function middleware(request: NextRequest) {
const response = NextResponse.next();
// 簡單隨機(jī)分流
if (Math.random() > 0.5) {
return NextResponse.rewrite(new URL("/experiment-a", request.url));
}
return NextResponse.rewrite(new URL("/experiment-b", request.url));
}
(4) 防盜鏈 / 訪問控制
export function middleware(request: NextRequest) {
const referer = request.headers.get("referer");
if (referer && !referer.includes("yourdomain.com")) {
return new NextResponse("禁止訪問", { status: 403 });
}
return NextResponse.next();
}
4. Middleware 的限制
- 運(yùn)行在 Edge Runtime,不支持
fs、net等 Node.js API。 - 執(zhí)行時(shí)間非常短,適合輕量邏輯。
- 不能直接修改響應(yīng)體(只能
rewrite、redirect、next)。 - 如果邏輯復(fù)雜,應(yīng)該放在 API Route 或 Server Action 里處理。
到此這篇關(guān)于Next.js 中 middleware 中間件使用方式的文章就介紹到這了,更多相關(guān)Next.js middleware 中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Layui當(dāng)中的導(dǎo)航條動態(tài)添加后渲染失敗的問題
今天小編就為大家分享一篇解決Layui當(dāng)中的導(dǎo)航條動態(tài)添加后渲染失敗的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解
箭頭函數(shù)給我們的工作帶來了極大的方便,但是它們有什么缺點(diǎn)呢?我們應(yīng)該一直使用箭頭函數(shù)嗎?我們應(yīng)該在哪些場景中停止使用箭頭函數(shù)?本文就來為大家詳細(xì)講講2022-07-07
微信小程序?qū)崿F(xiàn)列表項(xiàng)上移下移效果
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)列表項(xiàng)上移下移效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

