Next.js 是一套基于 React 的服务器端渲染框架,为了能够更好的实现服务端渲染,我们会尽量使用服务端组件来编写,那么如何在服务端组件获取到当前页面的路径呢?我们可以通过中间件(middleware)来实现。

Middleware

Next.js 的中间件(Middleware)是一种允许在请求完成之前运行代码的功能,它可以根据传入的请求来修改请求或响应。所以我们可以通过中间件来实现,获取当前请求的路径,放到请求头(request)对象里,然后用 nextjs/headers 提供的 headers 方法来获取。具体实现方式如下:

// middleware.ts
import { NextResponse } from 'next/server';

export function middleware(request: Request) {
  const reqHeaders = new Headers(request.headers);
  reqHeaders.set('x-request-url', request.url);
  return NextResponse.next({
    request: {
      headers: reqHeaders,
    }
  });
}

服务端组件获取请求路径

import { headers } from 'next/headers';
export default function Nav() {
  const headersList = headers();
  const header_url = headersList.get('x-request-url') || "";
}

这样就可以获取到当前页面的路径,不过由于是服务端组件,后续不会根据新的路径进行跳转,这是因为 Next.js 在首次访问后,后续的访问页面是客户端渲染。