跳至主要内容

Next.js 30 天全端實戰:Day 15 - Middleware:掌握請求的全局控制權

一、 前言

在過去的開發經驗中,如果我們想保護某些頁面不被未登入的使用者看到,我們可能得在每個 page.tsx 裡重複寫權限判斷。這不僅麻煩,還容易漏掉。

Next.jsMiddleware 讓我們能在一處統一處理這些「橫切面 (Cross-cutting)」的邏輯。它運行在 Edge Runtime,這意味著它在地理位置上離使用者最近,反應極快,能在網頁開始渲染前就做出決策。


二、 本文:Middleware 實戰配置

1. 如何開始?

src 目錄下(與 app 同級)建立一個名為 middleware.ts 的檔案。Next.js 會自動識別它。

[檔案:src/middleware.ts]

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
// 這裡寫你的守門邏輯
return NextResponse.next();
}

2. 設定匹配路徑 (Matcher)

你肯定不希望所有的圖片、字體請求都經過 Middleware,這樣會浪費效能。我們可以透過 config 來過濾特定的路徑。

export const config = {
// 只針對 /dashboard 以及 /admin 開頭的路徑執行
matcher: ['/dashboard/:path*', '/admin/:path*'],
};

3. 常見應用場景

A. 權限檢查 (Authentication)

檢查使用者是否有 Token,若無則強制導回登入頁。

export function middleware(request: NextRequest) {
const token = request.cookies.get('session-token');

if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
}