proxy.ts در Next.js — محافظ بی‌صدا در لبهٔ اپلیکیشن

فایل proxy.ts در Next.js جایگزین middleware.ts شده و به‌عنوان نگهبان لبه‌ای قبل از اجرای اپلیکیشن عمل می‌کند. این فایل می‌تواند مسیرها را بازنویسی یا ریدایرکت کند، هدرها و کوکی‌ها را تنظیم کند، دسترسی را محدود کند، و وظایف پس‌زمینه را اجرا کند. این مقاله نحوهٔ استفاده از proxy.ts، تعریف matcherها، و پیاده‌سازی سناریوهای واقعی مانند احراز هویت، تست A/B، و تنظیم CORS را آموزش می‌دهد.

matcherNextResponseEdge Middleware

~2 دقیقه مطالعه • بروزرسانی ۲۱ آذر ۱۴۰۴

۱. چرا proxy.ts؟


فایل middleware.ts در نسخه‌های جدید Next.js به proxy.ts تغییر نام داده تا با Express اشتباه نشود و نقش آن به‌عنوان پروکسی شبکه‌ای در لبهٔ اپلیکیشن واضح‌تر باشد.


۲. قابلیت‌های proxy.ts


عملکد
ریدایرکتNextResponse.redirect()
بازنویسی مسیرNextResponse.rewrite()
تنظیم هدرresponse.headers.set()
تنظیم کوکیresponse.cookies.set()
محدودسازی دسترسیreturn new Response('401')
ثبت آنالیتیکسevent.waitUntil(fetch(...))

۳. ساختار اولیه فایل proxy.ts


// proxy.ts
import { NextResponse, NextRequest } from 'next/server'

export function proxy(request: NextRequest) {
  return NextResponse.redirect(new URL('/home', request.url))
}

export const config = {
  matcher: '/about/:path*',
}

۴. تعریف matcher دقیق


  • مسیر خاص: '/about'
  • چند مسیر: ['/dashboard', '/profile']
  • Wildcard: '/blog/:path*'
  • Regex: '/(?!api|_next/static).*'

۵. مثال‌های واقعی


۵.۱ محافظ احراز هویت

if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
  return NextResponse.redirect(new URL('/login', request.url))
}

۵.۲ تست A/B

url.pathname = random < 0.5 ? '/experiments/a' : '/experiments/b'

۵.۳ ریدایرکت بر اساس کشور

if (country === 'IR') {
  return NextResponse.rewrite(new URL('/fa', request.url))
}

۵.۴ تنظیم CORS برای API

response.headers.set('Access-Control-Allow-Origin', origin)

۵.۵ هدرهای امنیتی

response.headers.set('X-Frame-Options', 'DENY')

۶. وظایف پس‌زمینه با waitUntil


event.waitUntil(fetch('https://analytics.com/log', { method: 'POST', body: ... }))

۷. تست فایل proxy.ts


unstable_doesProxyMatch({ config, url: '/dashboard' })

۸. بهترین شیوه‌ها


انجام بدهانجام نده
matcher دقیق بنویسروی همه مسیرها اجرا نکن
زود return کنمنطق سنگین اجرا نکن
از waitUntil برای لاگ استفاده کنپاسخ را بلوکه نکن
کوکی و هدر تنظیم کنبه state جهانی وابسته نباش
کد stateless بنویسماژول‌های app را share نکن

۹. مهاجرت از middleware.ts به proxy.ts


npx @next/codemod@canary middleware-to-proxy .

۱۰. چه زمانی از proxy استفاده کنیم؟


کاربرداستفاده از proxy؟
ریدایرکت احراز هویتبله
تست A/Bبله
فلگ ویژگی‌هابله
ثبت لاگبله (با waitUntil)
محدودسازی نرخبله (در edge)
ریدایرکت SEOبله
رندر صفحهنه — از Server Component یا getServerSideProps استفاده کن

نوشته و پژوهش شده توسط دکتر شاهین صیامی