Next.js中间件怎么处理动态路由时老是404?

Zz翠翠 阅读 534

我在Next.js项目里写了个中间件想拦截动态路由/api/posts/:id,但访问具体ID时还是报404…

代码是这样的:


export const config = {
  matcher: '/api/posts/:id'
}

export default function middleware(req, res) {
  console.log('拦截到请求!')
  // ...
}

但访问/api/posts/123时控制台没输出,直接返回404。我检查过文件路径和拼写都没问题,这是哪里设置错了?

我来解答 赞 18 收藏
二维码
手机扫码查看
1 条解答
程序猿溢洋
你的问题出在中间件的 matcher 配置上。Next.js 的中间件匹配规则有点坑,动态路由需要特别注意。

你现在的 matcher 写的是 '/api/posts/:id',但 Next.js 不支持直接用这种带参数的方式匹配动态路径。正确的写法是:

export const config = {
matcher: '/api/posts/:id*'
}

export default function middleware(req) {
console.log('拦截到请求!', req.nextUrl.pathname)
// 在这里处理逻辑
}


重点是加了个 * ,这样就可以匹配 /api/posts/ 后面的所有内容了。记得 req.nextUrl.searchParamsreq.nextUrl.pathname 可以用来获取具体参数。

另外提醒一下,res 在中间件里是不存在的,只有 reqnext(),官方文档这块确实容易让人误解。改完试试,应该就不会404了。
点赞 12
2026-02-02 01:06