Skip to Content

Next.js (البرمجية الوسيطة)

تعمل برمجية Next.js الوسيطة عند الحافة، مما يعني أنها تُنفذ على مسافة قريبة جداً من مستخدميك قبل أن يصل الطلب إلى مسارات API القياسية أو إجراءات الخادم أو قاعدة البيانات. هذه هي نقطة التفتيش المثلى لإسقاط حركة المرور الخبيثة.

البرمجية الوسيطة

يستخدم هذا التطبيق كائن NextRequest الأصلي لاستخراج IP العميل بموثوقية. يستعلم من ProxyTracer باستخدام بيئة تشغيل الحافة خفيفة الوزن ويفرض مهلة زمنية صارمة قدرها 500 مللي ثانية لضمان بقاء تحميل صفحاتك فائق السرعة.

// middleware.ts import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export async function middleware(request: NextRequest) { // 1. استخراج عنوان IP (يملأ Next.js حقل request.ip بأمان على Vercel/Edge) // الرجوع إلى الترويسات في حالة الاستضافة الذاتية خلف بروكسي عكسي مخصص const ip = request.ip || request.headers.get('x-forwarded-for')?.split(',')[0].trim() // التمرير في حالة التطوير المحلي if (!ip || ip === '127.0.0.1' || ip === '::1') { return NextResponse.next() } try { // 2. الاستعلام من ProxyTracer API باستخدام fetch الأصلي مع مهلة صارمة 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) // قطع الاتصال إذا استغرق > 500 مللي ثانية }) if (ptResponse.ok) { const data = await ptResponse.json() // 3. قطع الاتصال فوراً إذا تم اكتشاف بروكسي/VPN if (data.proxy === true) { return NextResponse.json( { error: "Access Denied: VPN or Proxy detected." }, { status: 403 } ) } } } catch (error) { // Fail open: إذا انقضت مهلة API، اسمح بحركة المرور لضمان استمرار الجاهزية console.error('ProxyTracer API Error:', error) } // 4. حركة المرور نظيفة، المتابعة إلى الصفحة المطلوبة أو مسار API return NextResponse.next() } // 5. تهيئة المطابق // تطبيق هذه البرمجية الوسيطة على المسارات الحساسة، أو تركها عامة لحماية كل شيء 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).*)', ], }

ملاحظة النشر على Vercel: إذا كنت تنشر على Vercel، فإن request.ip مضمون ليكون عنوان IP الحقيقي للعميل. لست بحاجة لتحليل ترويسات البروكسي يدوياً ما لم تكن تستضيف ذاتياً على بنية تحتية مخصصة لـ Node/Docker.

آخر تحديث في