Redirects and rewrites help you send users to different pages or change the URL behind the scenes. Middleware lets you do this before the page loads.
Redirect and rewrite in middleware in NextJS
Start learning this pattern below
Jump into concepts and practice - no test required
import { NextResponse } from 'next/server'; export function middleware(request) { // Redirect example if (request.nextUrl.pathname === '/old-path') { return NextResponse.redirect(new URL('/new-path', request.url)); } // Rewrite example if (request.nextUrl.pathname === '/about') { return NextResponse.rewrite(new URL('/company-info', request.url)); } return NextResponse.next(); }
Use NextResponse.redirect() to send users to a different URL.
Use NextResponse.rewrite() to change the URL internally without changing what the user sees.
return NextResponse.redirect(new URL('/login', request.url));
return NextResponse.rewrite(new URL('/dashboard', request.url));
if (request.nextUrl.pathname === '/old') { return NextResponse.redirect(new URL('/new', request.url)); }
if (request.nextUrl.pathname === '/profile') { return NextResponse.rewrite(new URL('/user/profile', request.url)); }
This middleware redirects anyone visiting '/home' to '/dashboard'. It also rewrites '/info' to show the content of '/about-us' without changing the URL in the browser.
import { NextResponse } from 'next/server'; export function middleware(request) { const { pathname } = request.nextUrl; // Redirect users from /home to /dashboard if (pathname === '/home') { return NextResponse.redirect(new URL('/dashboard', request.url)); } // Rewrite /info to /about-us internally if (pathname === '/info') { return NextResponse.rewrite(new URL('/about-us', request.url)); } // Continue normally for other paths return NextResponse.next(); }
Redirect changes the URL the user sees and sends them to a new page.
Rewrite changes the page content behind the scenes but keeps the URL the same.
Middleware runs before the page loads, so it is good for quick checks and changes.
Use NextResponse.redirect() to send users to a new URL.
Use NextResponse.rewrite() to change the page content without changing the URL.
Middleware lets you control routing before the page loads.
Practice
Solution
Step 1: Understand redirect behavior
A redirect sends the user to a new URL and updates the browser's address bar to that URL.Step 2: Understand rewrite behavior
A rewrite changes the content served without changing the URL shown in the browser.Final Answer:
Redirect changes the URL in the browser, rewrite does not. -> Option BQuick Check:
Redirect updates URL, rewrite keeps URL same [OK]
- Thinking rewrite changes browser URL
- Confusing redirect with rewrite
- Assuming both always change URL
Solution
Step 1: Check NextResponse.redirect syntax
The redirect method requires a full URL object, created with new URL(path, base).Step 2: Validate options
return NextResponse.redirect(new URL('/home', request.url)); correctly uses new URL with request.url as base. return NextResponse.redirect('/home'); incorrectly passes a string instead of URL object.Final Answer:
return NextResponse.redirect(new URL('/home', request.url)); -> Option DQuick Check:
Redirect needs URL object [OK]
- Passing string directly to redirect
- Using rewrite instead of redirect
- Missing base URL in new URL()
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname === '/dashboard') {
return NextResponse.rewrite(new URL('/profile', request.url));
}
return NextResponse.next();
}Solution
Step 1: Analyze rewrite usage
The code uses NextResponse.rewrite to serve '/profile' content when URL is '/dashboard'.Step 2: Understand rewrite effect on URL
Rewrite changes content served but keeps the browser URL unchanged as '/dashboard'.Final Answer:
User sees content from '/profile' but URL stays '/dashboard'. -> Option AQuick Check:
Rewrite changes content, not URL [OK]
- Confusing rewrite with redirect
- Expecting URL to change on rewrite
- Assuming middleware throws error here
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname === '/old') {
return NextResponse.redirect('/new');
}
return NextResponse.next();
}Solution
Step 1: Check redirect argument type
NextResponse.redirect expects a URL object, not a string path.Step 2: Validate other parts
Condition and NextResponse.next() usage are correct; async not required here.Final Answer:
Redirect requires a full URL object, not a string. -> Option CQuick Check:
Redirect needs URL object, not string [OK]
- Passing string directly to redirect
- Making middleware async unnecessarily
- Checking wrong request property
Solution
Step 1: Understand condition logic
We want to redirect if the path is NOT '/public' or '/login'. Using !includes checks this correctly.Step 2: Check each option's condition
if (!['/public', '/login'].includes(request.nextUrl.pathname)) { return NextResponse.redirect(new URL('/login', request.url)); } return NextResponse.next(); correctly uses negation with includes. if (['/public', '/login'].includes(request.nextUrl.pathname)) { return NextResponse.redirect(new URL('/login', request.url)); } return NextResponse.next(); redirects only on '/public' or '/login' which is wrong. Options C and D have logical errors in conditions.Final Answer:
Option A code correctly redirects except for '/public' and '/login'. -> Option AQuick Check:
Use !includes for exclusion check [OK]
- Using OR instead of AND in conditions
- Redirecting on allowed paths
- Incorrect logical negation
