Skip to Content
DocumentationEdge ComputingNext.js Middleware

Next.js (Middleware)

Se utilizzi Next.js (App Router o Pages Router), il modo migliore per implementare ProxyTracer è all'interno del file globale middleware.ts. Questo viene eseguito sull'Edge Runtime prima che qualsiasi pagina o route API venga renderizzata.

Il Middleware

Questo middleware sfrutta l'oggetto NextRequest per estrarre l'IP del client in modo sicuro (compatibile con Vercel Edge e reverse proxy self-hosted) e blocca le connessioni con un payload JSON 403.

// middleware.ts import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export async function middleware(request: NextRequest) { // 1. Estrai l'IP (Next.js popola request.ip in modo sicuro su Vercel/Edge) // Usa gli header come fallback in caso di self-hosting dietro un reverse proxy personalizzato const ip = request.ip || request.headers.get('x-forwarded-for')?.split(',')[0].trim() // Lascia passare in caso di sviluppo locale if (!ip || ip === '127.0.0.1' || ip === '::1') { return NextResponse.next() } try { // 2. Interroga l'API ProxyTracer usando fetch nativo con un timeout rigoroso 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) // Interrompe la connessione se impiega > 500ms }) if (ptResponse.ok) { const data = await ptResponse.json() // 3. Interrompi immediatamente la connessione se viene rilevato un proxy/VPN if (data.proxy === true) { return NextResponse.json( { error: "Access Denied: VPN or Proxy detected." }, { status: 403 } ) } } } catch (error) { // Fail open: se l'API va in timeout, consenti il traffico per garantire l'uptime console.error('ProxyTracer API Error:', error) } // 4. Il traffico è pulito, procedi alla pagina o alla route API richiesta return NextResponse.next() } // 5. Configura il Matcher // Applica questo middleware alle route sensibili, oppure lascialo globale per proteggere tutto 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).*)', ], }

Nota per il Deploy su Vercel: Se distribuisci su Vercel, request.ip è garantito essere l'IP reale del client. Non è necessario analizzare manualmente gli header del proxy a meno che tu non stia eseguendo il self-hosting su un'infrastruttura personalizzata Node/Docker.

Ultimo aggiornamento il