Next.js 14:是否需在Middleware的matcher中逐个声明受保护路由?
Next.js 14 Middleware 路由配置问题解答
1. 是否需要逐个声明所有受保护路由?
不需要。你当前的配置通过否定前瞻正则排除了公共路由(api/login、静态资源等),剩下的所有路由都会触发Middleware。之后在Middleware逻辑里,只对/api开头的路径做权限验证,这种方式已经覆盖了所有非公共的API路由,无需逐个列出受保护的具体路由。
2. 动态生成matcher的写法是否可行?
你的写法完全可行,这种方式能让公共路由的配置更清晰、易维护。
优化后的完整代码示例:
import { NextResponse } from "next/server"; import { NextRequest } from "next/server"; import { getApiAuth } from "./app/middleware/api/auth"; const validateApi = (req: Request) => { const isValid = getApiAuth(req); if (!isValid) return new NextResponse( JSON.stringify({ message: "Un-authorized", }), { status: 401, } ); }; export function middleware(request: NextRequest) { console.log("Cookie", request.cookies); const isApiPath = request.nextUrl.pathname.startsWith("/api"); if (isApiPath) { return validateApi(request); } return NextResponse.next(); } // 集中管理公共路由,便于后续修改 const publicRoutes = [ "api/login", "_next/static", "_next/image", "favicon.ico", ]; export const config = { matcher: `/((?!${publicRoutes.join("|")}).*)`, };
关键注意点:
- 如果公共路由包含正则特殊字符(如
.、?等),需要提前转义,避免正则匹配逻辑出错。比如带有参数的路由api/reset-password/:token,需要调整正则写法或单独处理。 - Next.js在构建阶段会解析
config.matcher,所以动态生成的字符串必须是静态可计算的(不能使用运行时才能确定的变量),你当前用静态数组拼接的写法完全符合要求。
内容的提问来源于stack exchange,提问作者Dipta Biswas
相关产品推荐
相关产品推荐

