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. Extraire l'IP (Next.js renseigne request.ip en toute sécurité sur Vercel/Edge) // Repli sur les en-têtes en cas d'auto-hébergement derrière un reverse proxy personnalisé const ip = request.ip || request.headers.get('x-forwarded-for')?.split(',')[0].trim() // Laisser passer en cas de développement local if (!ip || ip === '127.0.0.1' || ip === '::1') { return NextResponse.next() } try { // 2. Interroger l'API ProxyTracer avec fetch natif et un timeout strict 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) // Interrompt la connexion si elle prend > 500ms }) if (ptResponse.ok) { const data = await ptResponse.json() // 3. Interrompre immédiatement la connexion si un proxy/VPN est détecté if (data.proxy === true) { return NextResponse.json( { error: "Access Denied: VPN or Proxy detected." }, { status: 403 } ) } } } catch (error) { // Fail open : si l'API expire, autoriser le trafic pour garantir la disponibilité console.error('ProxyTracer API Error:', error) } // 4. Le trafic est sain, poursuivre vers la page demandée ou la route API return NextResponse.next() } // 5. Configurer le Matcher // Appliquer ce middleware aux routes sensibles, ou le laisser global pour tout protéger 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.

Dernière mise à jour le