Next.jsのmiddlewareに関して

2025-06-02に公開

今回はNext.jsのmiddlewareに関しての記事になります。
本記事は Next.js 13 以降の App Routerを前提として解説しています。

1.Next.jsのmiddlewareでできること

Next.jsのmiddlware.tsは、リクエストがルートやAPIに到達する直前に処理を差し込める機能です。Edge Runtime上で動作する軽量な前処理レイヤーとして、以下のようなことに使われます。

・認証ガード: /mypageなどの保護ルートに未ログインユーザーをリダイレクト
・Basic認証: .envで環境を判定して、ステージング環境などでベーシック認証をかける


2.実行タイミングと適用範囲

実行タイミング
・すべてのリクエスト(ページ表示、 API呼び出し、画像取得など)の直前
・SSR/ISR/CSRすべてに適用される
・クライアント側(ブラウザ)には一切表示されない

除外設定をしたいときはmatcherを使う

export const config = {
   matcher: ['/((?!api/v1/revalidate).*)'],
}

このようにして、特定のルートを除外することができます。

3.middlewareの基本的な書き方

middleware.tsをプロジェクトルートまたはsrc/配下に設置すれば自動で読み込まれます。

// middleware.ts
import { NextRequest, NextResponse } from 'next/server'

export function middleware(request: NextRequest) {
  const url = request.nexturl

  // 認証チェック
 const isLoggedIn = request.cookie.get('session')
  if(!isLoggedIn && url.pathname.startWith('/dashboard')) {
    return NextResponse.redirect(new URL('/login', request.url))
  }
  
  return NextResponse.next() // 通常通り処理を継続
} 


POSTとGETを分けて制御したい場合

if (request.method === 'POST') {
  // POST専用の処理(例: 外部Webhookの検証)
}


matcherによる適用範囲の制御

export const config = {
  matcher: ['/dashboard/:path*', '/admin/:path*']
}

ここのpathに関してmiddlewareを適用させる。

まとめ

・matcher を設定すると、指定したパスにだけmiddlewareが適用される
・:path* はワイルドカードで、「その階層以下すべて」を意味する
・何も設定しない場合、全リクエストがmiddlewareの対象になります