5 min read
ā¢Question 20 of 47mediumHow does Middleware work in Next.js?
Intercepting requests with middleware.
What You'll Learn
- Creating middleware
- Request modification
- Authentication patterns
Basic Middleware
code.txtTSX
// middleware.ts (root of project)
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
// Add custom header
const response = NextResponse.next();
response.headers.set('x-custom-header', 'value');
return response;
}
export const config = {
matcher: '/api/:path*',
};Authentication
code.txtTSX
import { NextResponse } from 'next/server';
import { getToken } from './lib/auth';
export async function middleware(request: NextRequest) {
const token = request.cookies.get('token');
if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*', '/api/protected/:path*'],
};Rewriting
code.txtTSX
export function middleware(request: NextRequest) {
// A/B testing
const bucket = Math.random() < 0.5 ? 'a' : 'b';
return NextResponse.rewrite(
new URL(`/experiments/${bucket}${request.nextUrl.pathname}`, request.url)
);
}Geolocation
code.txtTSX
export function middleware(request: NextRequest) {
const country = request.geo?.country || 'US';
if (country === 'IN') {
return NextResponse.rewrite(new URL('/in', request.url));
}
return NextResponse.next();
}