Next.js中间件里怎么获取请求的URL路径?

夏侯树辰 阅读 35

我在写Next.js的middleware时,想根据用户访问的路径做不同处理,但不知道怎么拿到当前请求的URL路径。试了request.url,结果是个完整URL,还要自己解析,有没有更直接的方法?

比如我想判断是不是访问/admin开头的路径,现在只能这样写:

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

export function middleware(request: NextRequest) {
  const url = new URL(request.url);
  if (url.pathname.startsWith('/admin')) {
    // 处理逻辑
  }
  return NextResponse.next();
}

感觉有点啰嗦,官方有没有更简洁的API?

我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
UX慧娟
UX慧娟 Lv1
问题应该出在你没发现 NextRequest 自带的 nextUrl 属性。这玩意儿已经是解析好的 URL 对象了,直接拿来用就行,不用自己再 new 一个。

改完之后是这样的:

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

export function middleware(request: NextRequest) {
if (request.nextUrl.pathname.startsWith('/admin')) {
// 处理逻辑
}
return NextResponse.next();
}


request.nextUrl 和你自己 new URL(request.url) 的区别在于,前者是 Next.js 帮你处理好的,包含了 pathname、searchParams 这些常用属性,直接访问就行。

顺便说一句,如果你这个中间件只针对 /admin 路径生效,更省事的做法是在配置里直接用 matcher 过滤,连 if 判断都省了:

export const config = {
matcher: '/admin/:path*',
};


这样中间件只会匹配 /admin 开头的请求,代码里就不用写路径判断了。 matcher 支持路径模式匹配,写法灵活,具体语法翻翻文档就行。
点赞
2026-03-01 09:01