Edge-side rendering with middleware

Showcase how to use Next.js middleware for edge-side rendering to modify a response before it's sent to the client, such as A/B testing.
import { NextResponse } from 'next/server';

export function middleware(request) {
    // Randomly assign a variant for A/B testing
    const variant = Math.random() < 0.5 ? 'A' : 'B';

    // Clone the request to modify its headers
    const response =;

    // Set a custom header with the variant
    response.headers.set('X-Variant', variant);

    // Return the modified response
    return response;
This middleware code randomly assigns a visitor to either variant 'A' or 'B' for A/B testing by setting a custom response header. This header can be used later on to determine which version of the website to serve.
import { useRouter } from 'next/router';
import { useEffect } from 'react';

export default function Page() {
    const router = useRouter();
    useEffect(() => {
        const variant = router.query.variant;
        if (variant === 'A') {
            // Logic for variant A
        } else if (variant === 'B') {
            // Logic for variant B
    }, [router.query.variant]);

    return (
            {/* Page content that might differ based on variant */}
This is a Next.js page component that uses the `useRouter` hook from Next.js to access the 'variant' query parameter set by the middleware. It applies different logic based on the variant.