为什么Next.js中间件重写不会运行两次?

hs1rzwqc  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(164)

Next.js中间件未运行

我正在尝试使用next.js middleware,我遇到了需要两个重定向的情况。一个用于将桌面URL更改为移动的URL,另一个用于更改URL中的searchParams。
第一个是根/顶中间件,第二个是路由较低的中间件。我不知道为什么,但是当桌面中间件在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}`)
}

文件夹结构

**桌面中间件:**pages > _middleware.ts
**SearchParams中间件:**pages > store > category > _middleware.ts

flvtvl50

flvtvl501#

不能重写两次

我在这里做的不是重定向,而是重写。
我不知道为什么,但我发现这是不可能做两个重定向,我认为他们不遵循正常访问的整个流程,所以第二个它永远不会达到。
这样做的方法是使用NextResponse.redirect**而不是NextResponse.rewrite

一定要这样做,因为可以破坏你的SEO。
Next.js 12.2以上版本

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

相关问题