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