为什么Next.js中间件重写没有运行两次



Next.js中间件未运行

我正在尝试使用next.js中间件,但遇到了需要两个重定向的情况。一个用于将桌面URL更改为移动URL,另一个用于更改URL中的searchParams。

第一个是根/顶部中间件,第二个是路由较低的中间件我不知道为什么,但当桌面中间件在它之前执行时,SearchParams中间件没有运行。难道不应该同时运行这两个吗

桌面重写:

export async function middleware(req: NextRequest) {
const { pathname } = req.nextUrl
const userAgent = req.headers.get('user-agent')
if (matchDesktop(pathname, userAgent)) {
return NextResponse.rewrite(`/desktop${req.nextUrl.pathname}`)
}
}

SearchParams筛选器重写:

export function middleware(req: NextRequest) {
const { pathname, origin } = req.nextUrl
const page = req.nextUrl.searchParams.get('page') || DEFAULT_PAGE
const sortBy = req.nextUrl.searchParams.get('sortBy') || DEFAULT_SORT_BY
return NextResponse.rewrite(`${origin}${pathname}${page}/${sortBy}`)
}

文件夹结构

桌面中间件:页面&gt_中间件.ts

SearchParams midleware:页面>商店>类别&gt_中间件.ts

不可能进行两次重写

我在这里做的不是重定向,而是重写。

我不知道为什么,但我发现不可能做两个重定向,我认为它们不遵循正常访问的整个流程,所以第二个永远无法到达。

这样做的方法是使用NextResponse.redirect而不是NextResponse.rewrite

一定要这样做,因为这会破坏你的SEO

Next.js 12.2或以上

从Next.js 12.2,您只能使用一个需要与pages文件夹处于同一级别的middleware.js文件。

最新更新