最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Next.js 中 middleware 中間件使用方式

 更新時(shí)間:2026年01月27日 09:31:48   作者:新節(jié)  
本文主要介紹了Next.js 中 middleware 中間件使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

從 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.tsmiddleware.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,不支持 fsnet 等 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)文章

  • 利用pixi.js制作簡(jiǎn)單的跑酷小游戲

    利用pixi.js制作簡(jiǎn)單的跑酷小游戲

    PixiJS 提供一個(gè)適用于所有設(shè)備的快速輕量級(jí) 2D 庫(kù)。PixiJS 具有完整的 WebGL 支持,并且可以無(wú)縫地回退到 HTML5 的畫(huà)布。 本文將使用pixi.js制作簡(jiǎn)單的跑酷小游戲,感興趣的可以嘗試一下
    2022-07-07
  • 解決Layui當(dāng)中的導(dǎo)航條動(dòng)態(tài)添加后渲染失敗的問(wèn)題

    解決Layui當(dāng)中的導(dǎo)航條動(dòng)態(tài)添加后渲染失敗的問(wèn)題

    今天小編就為大家分享一篇解決Layui當(dāng)中的導(dǎo)航條動(dòng)態(tài)添加后渲染失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • webpack -v報(bào)錯(cuò)解決方案

    webpack -v報(bào)錯(cuò)解決方案

    這篇文章主要介紹了webpack -v報(bào)錯(cuò)解決方案,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • p5.js實(shí)現(xiàn)斐波那契螺旋的示例代碼

    p5.js實(shí)現(xiàn)斐波那契螺旋的示例代碼

    本篇文章主要介紹了p5.js實(shí)現(xiàn)斐波那契螺旋的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解

    JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解

    箭頭函數(shù)給我們的工作帶來(lái)了極大的方便,但是它們有什么缺點(diǎn)呢?我們應(yīng)該一直使用箭頭函數(shù)嗎?我們應(yīng)該在哪些場(chǎng)景中停止使用箭頭函數(shù)?本文就來(lái)為大家詳細(xì)講講
    2022-07-07
  • 微信小程序?qū)崿F(xiàn)列表項(xiàng)上移下移效果

    微信小程序?qū)崿F(xiàn)列表項(xiàng)上移下移效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)列表項(xiàng)上移下移效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS控制表單提交的方法

    JS控制表單提交的方法

    這篇文章主要介紹了JS控制表單提交的方法,可實(shí)現(xiàn)基于javascript提交表單信息的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • JS解決ajax無(wú)法后退的問(wèn)題記錄

    JS解決ajax無(wú)法后退的問(wèn)題記錄

    Ajax請(qǐng)求通常不支持瀏覽器的后退按鈕,因?yàn)樗鼈兪钱惒降?不會(huì)導(dǎo)致頁(yè)面重新加載(刷新),但如果你想要用戶能夠通過(guò)瀏覽器的后退按鈕回到之前的頁(yè)面狀態(tài),你可以通過(guò)幾種方法來(lái)解決這個(gè)問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • 拖動(dòng)層效果,兼容IE和FF!

    拖動(dòng)層效果,兼容IE和FF!

    拖動(dòng)層效果,兼容IE和FF!...
    2006-11-11
  • JavaScript手寫(xiě)call,apply,bind方法

    JavaScript手寫(xiě)call,apply,bind方法

    這篇文章主要介紹了JavaScript手寫(xiě)call,apply,bind方法,call,bind,apply方法都是JavaScript原生的方法,掛載在Function原型上,使得所有函數(shù)都可以調(diào)用
    2022-06-06

最新評(píng)論

绥芬河市| 沙湾县| 虎林市| 谷城县| 施甸县| 两当县| 南乐县| 南郑县| 武安市| 渭南市| 冀州市| 芦溪县| 平度市| 越西县| 柯坪县| 乡宁县| 绍兴市| 信阳市| 驻马店市| 普陀区| 翁牛特旗| 郑州市| 汕尾市| 邵阳县| 遂昌县| 芜湖市| 江北区| 涪陵区| 保亭| 壤塘县| 吉隆县| 大埔县| 巴林右旗| 潮州市| 沙田区| 扶沟县| 锡林郭勒盟| 尼勒克县| 资阳市| 汝南县| 云阳县|