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.