Skip to Content
DocumentationCalcul EdgeNext.js Middleware

Next.js (Middleware)

Le middleware Next.js Edge s'exécute à l'Edge, c'est-à-dire au plus près de vos utilisateurs avant même qu'une requête n'atteigne votre routage d'API standard, vos Server Actions ou votre base de données. C'est le point d'inspection idéal pour couper court au trafic malveillant.

L'Intergiciel

Cette implémentation utilise l'objet natif NextRequest pour extraire en toute fiabilité l'adresse IP du client. Elle interroge l'API ProxyTracer au sein de la machine Edge légère et impose rigoureusement un délai maximal de 500 ms afin d'assurer des temps de chargement ultra-rapides.

// middleware.ts import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export async function middleware(request: NextRequest) { // 1. Extract the IP (Next.js populates request.ip securely on Vercel/Edge) // Fallback to headers if self-hosting behind a custom reverse proxy const ip = request.ip || request.headers.get('x-forwarded-for')?.split(',')[0].trim() // Pass through if local development if (!ip || ip === '127.0.0.1' || ip === '::1') { return NextResponse.next() } try { // 2. Query ProxyTracer API using native fetch with a strict timeout 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) // Drops the connection if it takes > 500ms }) if (ptResponse.ok) { const data = await ptResponse.json() // 3. Drop the connection immediately if a proxy/VPN is detected if (data.proxy === true) { return NextResponse.json( { error: "Access Denied: VPN or Proxy detected." }, { status: 403 } ) } } } catch (error) { // Fail open: If the API times out, allow traffic to ensure uptime console.error('ProxyTracer API Error:', error) } // 4. Traffic is clean, proceed to the requested page or API route return NextResponse.next() } // 5. Configure the Matcher // Apply this middleware to sensitive routes, or leave it global to protect everything 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).*)', ], }

Note de Déploiement sur Vercel : Lors de vos déploiements sur la plateforme Vercel, la valeur request.ip garantit légitimement la véritable adresse IP de votre visiteur. Vous êtes dispensés d'analyser manuellement les en-têtes de routage inverse à moins d'héberger vos clusters Node/Docker en autonomie sur des serveurs personnalisés.

Last updated on