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}`)
}
文件夹结构
桌面中间件:页面>_中间件.ts
SearchParams midleware:页面>商店>类别>_中间件.ts
不可能进行两次重写
我在这里做的不是重定向,而是重写。
我不知道为什么,但我发现不可能做两个重定向,我认为它们不遵循正常访问的整个流程,所以第二个永远无法到达。
这样做的方法是使用NextResponse.redirect
而不是NextResponse.rewrite
。
一定要这样做,因为这会破坏你的SEO
Next.js 12.2或以上
从Next.js 12.2,您只能使用一个需要与pages文件夹处于同一级别的middleware.js文件。