middleware.js
middleware.js|ts
ファイルは、Middleware を書き、request が完了する前に server 上で code を実行するために使用されます。次に、入ってくる request に基づいて、書き換え、Redirect、request や response headers の修正、または直接の応答によって response を変更することができます。
Middleware は routes がレンダリングされる前に実行されます。特に server-side でのカスタムロジック、例えば認証、ロギング、または redirects の処理などを実装するのに非常に役立ちます。
あなたのプロジェクトの root で、middleware.ts
(または .js)ファイルを使用して Middleware を定義します。例えば、app
や pages
と同じレベル、また適用可能な場合は src
内で。
import { NextResponse, NextRequest } from 'next/server'
// This function can be marked `async` if using `await` inside
export function middleware(request: NextRequest) {
return NextResponse.redirect(new URL('/home', request.url))
}
export const config = {
matcher: '/about/:path*',
}
import { NextResponse } from 'next/server'
// This function can be marked `async` if using `await` inside
export function middleware(request) {
return NextResponse.redirect(new URL('/home', request.url))
}
export const config = {
matcher: '/about/:path*',
}
Exports
Middleware 関数
ファイルは、単一の関数を export する必要があります。これは、 default export または、middleware
という名前である必要があります。同じファイルから複数の middleware はサポートされていないことに注意してください。
// Example of default export
export default function middleware(request) {
// Middleware logic
}
Config object (オプション)
オプションで、config object を Middleware 関数と一緒に export することができます。この object には、Middleware が適用される paths を指定するためのmatcherが含まれています。
Matcher
matcher
オプションは、特定の paths を Middleware が実行する対象として指定することができます。これらの paths はいくつかの方法で指定することができます:
- 単一の path について: 直接 string を使用して path を定義します。たとえば、
'/about'
のように。 - 複数の paths について:複数の paths をリスト化するために配列を使用します。例えば、
matcher: ['/about', '/contact']
のように、Middleware を/about
と/contact
の両方に適用します。
さらに、matcher
は、matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)']
のような正規表現を通じて複雑な path 仕様をサポートしており、どの paths を含めるか除外するかについて精密な制御を可能にします。
matcher
オプションは、以下のキーを持つ Object の配列も受け入れます:
source
:path または request paths に一致させるために使用されるパターンです。これは直接的な path 一致用の string であるか、より複雑な一致用のパターンであることができます。regexp
(オプション): source に基づいてマッチングを微調整する正規表現の string。これにより、含まれるまたは除外される paths をより詳細に制御できます。locale
(オプション):これがfalse
に設定されていると、 path のマッチングにおいてロケールベースのルーティングを無視する boolean です。has
(オプション): 特定の request 要素(例えば headers, query パラメーター、または cookies)の存在に基づく条件を指定します。missing
(オプショナル):特定の request 要素が欠けている状況に焦点を当てます。例えば、 missing headers や cookies などです。
export const config = {
matcher: [
{
source: '/api/*',
regexp: '^/api/(.*)',
locale: false,
has: [
{ type: 'header', key: 'Authorization', value: 'Bearer Token' },
{ type: 'query', key: 'userId', value: '123' },
],
missing: [{ type: 'cookie', key: 'session', value: 'active' }],
},
],
}
Params
request
Middleware を定義する際、 default export 関数は一つのパラメーターrequest
を受け入れます。このパラメータはNextRequest
のインスタンスで、これは着信 HTTP request を表します。
import type { NextRequest } from 'next/server'
export function middleware(request: NextRequest) {
// Middleware logic goes here
}
export function middleware(request) {
// Middleware logic goes here
}
Good to know:
NextRequest
は、Next.js Middleware の中で入ってくる HTTPRequest を表す type であり、一方でNextResponse
は、HTTPResponse を操作して返送するためのクラスです。
NextResponse
Middleware は、Web Response API を拡張するNextResponse
object を使用できます。NextResponse
object を返すことで、直接 cookies を操作したり、 headers を設定したり、 redirects を実装したり、 rewrite paths ことができます。
Good to know: redirects の場合、
NextResponse.redirect
の代わりにResponse.redirect
も使用できます。
Runtime
Middleware はEdge runtimeのみをサポートしています。 Node.js runtime は使用できません。
Version History
Version | Changes |
---|---|
v13.1.0 | Advanced Middleware flags added |
v13.0.0 | Middleware can modify request headers, response headers, and send responses |
v12.2.0 | Middleware is stable, please see the upgrade guide |
v12.0.9 | Enforce absolute URLs in Edge Runtime (PR ) |
v12.0.0 | Middleware (Beta) added |