Next.js(Middleware)
Next.js Middleware を使用すると、リクエストが完了する前にコードを実行できます。Edge Runtime を活用することで、ページレンダリングや API ルートが実行される前に受信リクエストを分析し、VPN やプロキシユーザーをブロックできます。
ミドルウェアの実装
この実装では、ネイティブの NextRequest オブジェクトを利用してクライアント IP を確実に抽出します。軽量な Edge Runtime を使用して ProxyTracer API を取得し、ページの読み込み速度を高速に保つために 500ms のタイムアウトを厳格に適用します。
// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
export async function middleware(request: NextRequest) {
// 1. IPを抽出 (Next.jsはVercel/Edge上でrequest.ipを安全に入力します)
// カスタムリバースプロキシの背後でセルフホストしている場合はヘッダーにフォールバック
const ip = request.ip || request.headers.get('x-forwarded-for')?.split(',')[0].trim()
// ローカル開発環境の場合はパススルー
if (!ip || ip === '127.0.0.1' || ip === '::1') {
return NextResponse.next()
}
try {
// 2. 厳格なタイムアウトを設定したネイティブfetchを使用してProxyTracer APIにクエリを実行
const ptResponse = await fetch(`https://api.proxytracer.com/v1/check/${ip}`, {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.PROXYTRACER_API_KEY}`
},
signal: AbortSignal.timeout(500) // 500ミリ秒以上かかる場合は接続を切断
})
if (ptResponse.ok) {
const data = await ptResponse.json()
// 3. プロキシ/VPNが検出された場合は直ちに接続を切断
if (data.proxy === true) {
return NextResponse.json(
{ error: "Access Denied: VPN or Proxy detected." },
{ status: 403 }
)
}
}
} catch (error) {
// フェイルオープン: APIがタイムアウトした場合でも稼働率を維持するためトラフィックを許可
console.error('ProxyTracer API Error:', error)
}
// 4. トラフィックは正常です。要求されたページまたはAPIルートへ処理を渡します
return NextResponse.next()
}
// 5. Matcherを設定
// このミドルウェアを機密ルートに適用するか、全体を保護するためにグローバルのままにします
export const config = {
matcher: [
/*
* Match all request paths except for the ones starting with:
* - _next/static (static files)
* - _next/image (image optimization files)
* - favicon.ico (favicon file)
*/
'/((?!_next/static|_next/image|favicon.ico).*)',
],
}使用方法: このファイルを Next.js アプリケーションのルート(または src/ ディレクトリを使用している場合はその直下)に middleware.ts として保存します。特定の機密ルートを対象とするように matcher 設定を更新してください。
最終更新日: