
AI Assisted
この記事は筆者の実装経験をもとに実装コードをベースで執筆し、AIによる校閲・推敲を経て公開しています。
Next.js 16 で middleware.ts が非推奨になり、proxy.ts への移行が必要になりました。この記事では、proxy.ts とは何か、なぜこの変更が行われたのか背景を解説し、実際の移行手順を紹介します。
proxy.ts は、リクエストがページやAPIに到達する前に実行される処理を書くファイルです。プロジェクトルートまたは src/ ディレクトリに配置します。
リクエスト → [proxy.ts] → ページ/API
| 機能 | 説明 |
|---|---|
| リダイレクト | 別のURLに転送 |
| リライト | URLはそのままで別のページを表示 |
| ヘッダー操作 | リクエスト/レスポンスヘッダーの追加・変更 |
| クッキー操作 | クッキーの取得・設定・削除 |
| レスポンス返却 | JSONなどを直接返す |
// proxy.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export function proxy(request: NextRequest) {
// リクエスト情報の取得
const pathname = request.nextUrl.pathname
// リダイレクト
if (pathname === '/old') {
return NextResponse.redirect(new URL('/new', request.url))
}
// リライト(URLはそのまま、別ページを表示)
if (pathname === '/blog') {
return NextResponse.rewrite(new URL('/news', request.url))
}
// 何もしない(次の処理へ)
return NextResponse.next()
}
すべてのリクエストで実行すると重いので、config.matcher で対象を絞ります。
export const config = {
matcher: [
// /admin 以下すべて
'/admin/:path*',
// /api/admin 以下すべて
'/api/admin/:path*',
],
}
matcher の書き方:
| パターン | マッチするパス |
|---|---|
/about | /about のみ |
/about/:path | /about/a, /about/b |
/about/:path* | /about, /about/a, /about/a/b/c |
/about/:path+ | /about/a, /about/a/b(/about 単体は除外) |
proxy.ts は以下の順序で実行されます:
next.config.js の headersnext.config.js の redirectspublic/, _next/static/)「middleware」という名前は Express.js のミドルウェアを連想させます。Express のミドルウェアは、リクエスト処理の途中で任意のロジックを挟み込む汎用的な仕組みです。
しかし、Next.js の middleware は違います。できることは限られています:
これは「ミドルウェア」というより「プロキシ」の役割です。アプリケーションの前段でリクエストを受け取り、ルーティングを制御する。この実態に合わせて proxy という名前に変更されました。
2025年3月、Next.js のミドルウェアに深刻な脆弱性(CVE-2025-29927)が発見されました。
攻撃者が x-middleware-subrequest ヘッダーを付与するだけで、ミドルウェアの認証チェックを完全にバイパスできるという問題です。Next.js 11.1.4 から 15.2.2 までの全バージョンが影響を受けました。
この脆弱性の発見を機に、Next.js チームはミドルウェアの設計を見直しました。名前の変更はその一環です。
従来の middleware は Edge Runtime で動作していました。Edge Runtime は高速ですが、使える Node.js API が限られています:
fs)が使えない新しい proxy.ts は Node.js ランタイムで動作します。Edge の制限がなくなり、より柔軟な処理が可能になりました。
| 項目 | middleware.ts (従来) | proxy.ts (新) |
|---|---|---|
| ファイル名 | middleware.ts | proxy.ts |
| 関数名 | middleware | proxy |
| ランタイム | Edge Runtime | Node.js Runtime |
| config | そのまま使える | そのまま使える |
ロジックの変更は不要です。ファイル名と関数名を変えるだけで移行できます。
mv middleware.ts proxy.ts
# または
mv src/middleware.ts src/proxy.ts
// ❌ 従来
export function middleware(request: NextRequest) {
// ...
}
// ✅ 新
export function proxy(request: NextRequest) {
// ...
}
これだけです。config や処理ロジックはそのまま使えます。
codemod を使えば自動で変換できます。
npx @next/codemod@canary upgrade latest
Next.js 16 では middleware.ts は非推奨ですが、まだ動作します。起動時に警告が表示されます:
⚠ The "middleware" file convention is deprecated. Please use "proxy" instead.
Next.js 17 以降で middleware.ts は完全に削除される予定です。早めに移行しておくことをおすすめします。
proxy.ts は Node.js ランタイム固定です。Edge Runtime を使い続けたい場合は、当面 middleware.ts を使用してください。Vercel は今後のリリースで Edge Runtime のサポートについて詳細を発表予定です。
middleware 関連の設定フラグも名前が変わりました。
// ❌ 従来
skipMiddlewareUrlNormalize: true
// ✅ 新
skipProxyUrlNormalize: true
middleware.ts → proxy.ts への移行は、ファイル名と関数名を変えるだけスポーツ×ITの会社でバックエンドエンジニア兼マネージャーとして勤務。インテル関連の情報を中心に発信しています。
最終更新: 2026年1月24日
© 2025 nero15.dev. All rights reserved.