Next.jsのMiddleware実例:proxy.ts対応版

Next.js Middleware(Proxy)の実例

Next.js Middlewareの実例(現在はproxy.ts):認証、地域、A/B | We.Inc

Next.js 16でmiddleware.tsに代わったproxy.tsの実例集。認証リダイレクト、国別ルーティング、A/Bテスト用クッキー、言語判定、matcher、シミュレーターを用意しています。

Next.js 16では、Middlewareのファイル名はproxy.tsになり、proxyという名前の関数をエクスポートします。middleware.tsは非推奨となり、コードモッドで名前を変更できます。この関数はNextRequestを受け取り、リダイレクト、リライト、ヘッダーやクッキーの設定、レスポンスの返却を行えます。config.matcherで実行するパスを制限します。現在はデフォルトでNode.jsランタイムを使います。

Next.js 16での変更点

ネット上の回答の多くは、いまだにEdgeランタイムで動くmiddleware.tsを説明しています。ここで紹介する例は現在のファイル名を使い、そのまま動作し、応用しやすい短さに収めています。デプロイ前にシミュレーターを試せば、複数の処理を組み合わせたproxyのどの分岐が、特定のリクエストで実行されるかを確認できます。

よくある質問

Next.jsのMiddlewareは非推奨になったのですか?

非推奨になったのは名前です。バージョン16ではMiddlewareのファイル規約が非推奨となり、同じリクエストとレスポンスのAPIのままproxyに名前が変わりました。古いmiddleware.tsは移行することが想定されており、公式のコードモッドがファイル名とエクスポートする関数名の両方を変更します。

なぜproxyに名前が変わったのですか?

Next.jsチームによると、Middlewareという言葉がExpressのMiddlewareと混同され、使いすぎを招いていたためです。Proxyはアプリの手前にあるネットワークの境界を表す言葉で、ほかに適したAPIがない場合の最後の手段として使うよう推奨されています。

proxy.tsでEdgeランタイムを使えますか?

使えません。ProxyのデフォルトはNode.jsで、proxyファイルでランタイムのセグメントオプションを設定するとエラーになります。その代わり、Node.js専用のライブラリが使えるようになりました。これは、Edge専用だった以前のMiddlewareに対するよくある不満でした。

認証はproxyで行うべきですか?

最初のフィルターとしてだけ使いましょう。Next.jsの認証ガイドでは、すばやくリダイレクトするためにproxyでセッションクッキーを読み、データアクセス層、Server Actions、Route Handlersでもう一度セッションを検証するよう推奨しています。matcherで除外されたServer Functionsは、proxyを完全に素通りします。

静的エクスポートでもproxyは動きますか?

動きません。実行するサーバーがないため、ドキュメントのプラットフォーム表では静的エクスポートは非対応とされています。Node.jsサーバーとDockerは対応しており、ほかのホスティングはアダプター次第です。

リクエストの中でのproxyの位置

リダイレクトかリライトか

処理は軽く保つ

matcherのパターン

config.matcherのパスの動き

proxy.tsの例

ログアウト中の訪問者をリダイレクトする

楽観的なチェックです。セッションクッキーの有無だけを確認し、訪問者が向かっていた先を記憶します。

リライトによる国別ルーティング

訪問者のURLは/pricingのままで、EU向けページが表示されます。ここで使っている国のヘッダーはVercelが付与するものです。ほかのホスティングでは独自のヘッダー名を使います。

固定クッキーを使ったA/Bテスト

訪問者は一度だけグループに割り当てられ、クッキーによってそのグループにとどまり、リライトによって同じURLでバリエーションが表示されます。

訪問者を自分の言語のページへ送る

すでに対応ロケールで始まるパスはそのまま通過します。それ以外は、Accept-Languageで最初に一致した言語を使ってリダイレクトされます。

リクエストヘッダーでページに値を渡す

requestオプションの中でヘッダーを設定すると、ブラウザーに公開することなく、ルート側でheaders()を使って読み取れます。

認証の例:保護されたパスで、セッションクッキーがありません。

国の例:{country}はEUの一覧に含まれるため、同じURLでEU向けページが表示されます。

A/Bの例:訪問者はグループ{bucket}に属し、クッキーによってそのまま維持されます。

言語のmatcherで除外されているため、リクエストはそのまま続行されます。

言語の例:パスにすでに対応ロケールが含まれています。

言語の例:ヘッダー内で最初に対応している言語は{locale}です。

Proxyシミュレーター

パス、セッションクッキー、国、ブラウザーの言語を設定すると、下の例がリクエストを通過させるか、リダイレクトするか、リライトするかを確認できます。

リクエストのパス

国のヘッダー(x-vercel-ip-country)

Accept-Languageヘッダー

A/Bのクッキーグループ

リクエストにセッションクッキーがある

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る