跳到主要内容

middleware

next.js允许你在请求完成之前,编写中间件。你可以重写、重定向、修改请求或响应标头。

目录结构

middleware.js 文件必须放放在和app目录同级的目录中。

src
├── app
├── middleware.ts
import { NextResponse } from 'next/server'

export function middleware(request) {
return NextResponse.redirect(new URL('/home', request.url))
}

export const config = {
matcher: '/about/:path*',
}

config.matcher

你可以使用config.matcher来匹配请求, 只有匹配的请求才会执行中间件。

export const config = {
// 只有/about和/contact请求才会执行中间件
matcher: ['/about', '/contact'],
// 正则匹配,排除api、_next/static、_next/image、*.png请求
matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)']
}

修改请求

重写请求

import { NextResponse } from 'next/server'

export function middleware(request) {
const {pathname} = request.nextUrl;

// 重写请求
if (pathname.startsWith('/tk/')) {
return NextResponse.rewrite(new URL(pathname.replace(/^\/tk/, ''), request.url));
}
}

export const config = {
matcher: '*'
}

修改请求头

export function middleware(request: NextRequest) {
// 修改请求头
const requestHeaders = new Headers(request.headers);
requestHeaders.set('Language', 'zh');
return NextResponse.next(
{request: {headers: requestHeaders}}
);
}

export const config = {
matcher: '*'
}

具体的NextResponse对象可以参考NextResponse