Next.js 中 middleware 中間件使用方式
從 Next.js 16 開(kāi)始,中間件Middleware更名為代理(Proxy),以更好地體現(xiàn)其用途。其功能保持不變。
1. 什么是 Middleware?
- Middleware 是運(yùn)行在 請(qǐng)求到達(dá)路由之前 的一個(gè)函數(shù)。
- 它位于 用戶請(qǐng)求 和 路由處理器 之間,可以對(duì)請(qǐng)求進(jìn)行 攔截、修改、重定向、鑒權(quán) 等操作。
- 本質(zhì)上是運(yùn)行在 Edge Runtime(輕量、無(wú) Node.js API,僅 Web API)。
2. Middleware 的文件位置
- 必須放在項(xiàng)目根目錄的
middleware.ts或middleware.js文件中。 - 作用范圍取決于你在
matcher中定義的路徑。
project/ ├── app/ ├── middleware.ts ?? 全局 Middleware └── package.json
3. 常見(jiàn)場(chǎng)景
(1) 權(quán)限控制 / 鑒權(quán)
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function middleware(request: NextRequest) {
// 打印請(qǐng)求路徑
console.log("請(qǐng)求路徑:", 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 等。都會(huì)觸發(fā) middleware 函數(shù)。
上面的代碼含義:如果用戶未登錄,并且請(qǐng)求路徑以 /dashboard 開(kāi)頭,就重定向到 /auth/signin。
如圖未登錄:

如圖已登錄:

(2) 國(guó)際化 / 路由重寫(xiě)
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// 如果路徑?jīng)]有語(yǔ)言前綴,重寫(xiě)到默認(rèn)語(yǔ)言
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 測(cè)試
export function middleware(request: NextRequest) {
const response = NextResponse.next();
// 簡(jiǎn)單隨機(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) 防盜鏈 / 訪問(wèn)控制
export function middleware(request: NextRequest) {
const referer = request.headers.get("referer");
if (referer && !referer.includes("yourdomain.com")) {
return new NextResponse("禁止訪問(wèn)", { 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于MooTools的很有創(chuàng)意的滾動(dòng)條時(shí)鐘動(dòng)畫(huà)
一款很有創(chuàng)意的時(shí)鐘js動(dòng)畫(huà).是利用系統(tǒng)滾動(dòng)條來(lái)構(gòu)成一個(gè) 時(shí):分:秒 的盤. 再利用滾動(dòng)條的長(zhǎng)度變化做過(guò)渡動(dòng)畫(huà).2010-11-11
python實(shí)現(xiàn)迭代法求方程組的根過(guò)程解析
這篇文章主要介紹了python實(shí)現(xiàn)迭代法求方程組的根過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Javascript實(shí)現(xiàn)秒表倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了Javascript實(shí)現(xiàn)秒表倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
利用select實(shí)現(xiàn)年月日三級(jí)聯(lián)動(dòng)的日期選擇效果【推薦】
關(guān)于select控件,可能年月日三級(jí)聯(lián)動(dòng)的日期選擇效果是最常見(jiàn)的應(yīng)用了。本文將對(duì)日期選擇效果進(jìn)行詳細(xì)介紹。需要的朋友一起來(lái)看下吧2016-12-12
javascript實(shí)現(xiàn)不同顏色Tab標(biāo)簽切換效果
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)不同顏色Tab標(biāo)簽切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁(yè)面元素的方法
這篇文章主要介紹了JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁(yè)面元素的方法,涉及javascript針對(duì)頁(yè)面元素的遍歷與屬性操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06
關(guān)于JS模塊化的知識(shí)點(diǎn)分享
在本篇文章里小編給大家整理的是關(guān)于JS模塊化的知識(shí)點(diǎn)分享,有需要的朋友們可以學(xué)習(xí)下。2019-10-10
JavaScript生成器函數(shù)Generator解決異步操作問(wèn)題
這篇文章主要為大家介紹了JavaScript生成器函數(shù)Generator解決異步操作問(wèn)題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
JavaScript函數(shù)參數(shù)的傳遞方式詳解
本文主要介紹了JavaScript函數(shù)參數(shù)的傳遞方式,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03

