リクエストが処理される前に実行される関数。認証チェック・リダイレクト・ヘッダー追加などに使う。
// ── middleware.ts: プロジェクトルートに置く ──────────────
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// ── 認証チェック: ログインが必要なページを保護 ───────
if (pathname.startsWith('/dashboard')) {
const token = request.cookies.get('auth-token');
if (!token) {
// 未ログインなら /login にリダイレクト
const loginUrl = new URL('/login', request.url);
loginUrl.searchParams.set('from', pathname); // 元のURLを保存
return NextResponse.redirect(loginUrl);
}
}
// ── A/Bテスト: ランダムにバリアントを割り当て ─────────
if (pathname === '/') {
const variant = Math.random() < 0.5 ? 'A' : 'B';
const response = NextResponse.next();
response.cookies.set('variant', variant); // Cookieに保存
return response;
}
// ── ヘッダーの追加 ────────────────────────────────────
const response = NextResponse.next();
response.headers.set('X-Custom-Header', 'my-value');
return response;
}
// ── どのパスに適用するか設定 ──────────────────────────
export const config = {
matcher: [
'/dashboard/:path*', // /dashboard 以下すべて
'/((?!api|_next|favicon.ico).*)', // api・_next 以外すべて
],
};Middlewareはエッジランタイムで実行されるため、Node.js APIの一部は使えない。重い処理はRoute Handlerに委ねる。