#1 Data Analytics Program in India
₹2,499₹1,499Enroll Now
5 min read
•Question 20 of 47medium

How 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();
}