در Middleware, Next.js یک تابع است که قبل از اینکه درخواست به منطق سمت سرور شما (مثل مسیرهای API یا کامپوننتهای صفحه) برسد اجرا میشود. این امکان را به شما میدهد که کد را اجرا کنید، درخواستهای ورودی را بررسی کنید، و پاسخ را قبل از رسیدن به مقصد نهایی تغییر دهید.
Middleware میتواند برای وظایفی مانند احراز هویت، لاگبرداری، ریدایرکتها، هدرهای سفارشی، محدودیت نرخ درخواستها و موارد دیگر استفاده شود.
برای ایجاد middleware، باید فایلی با نام middleware.ts
یا middleware.js
در ریشه پروژه خود تعریف کنید.
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(req: NextRequest) {
// به عنوان مثال، میتوانید بررسیهای احراز هویت را در اینجا انجام دهید
const { pathname } = req.nextUrl;
// کاربر را در صورتی که در حال تلاش برای دسترسی به مسیر محافظتشده باشد ریدایرکت کنید
if (pathname.startsWith('/admin')) {
const token = req.cookies.get('token');
if (!token) {
// اگر احراز هویت نشده باشد، ریدایرکت به صفحه لاگین
return NextResponse.redirect(new URL('/login', req.url));
}
}
// اگر همه چیز درست بود، درخواست ادامه پیدا میکند
return NextResponse.next();
}
// مشخص کنید که middleware بر روی چه مسیرهایی اجرا شود
export const config = {
matcher: ['/admin/:path*'], // اجرای middleware برای مسیرهای admin
};
در این مثال، middleware:
/admin
است.if (!req.cookies.get('auth')) {
return NextResponse.redirect(new URL('/login', req.url));
}
۲. بازنویسی و ریدایرکت URL: میتوانید URLها را به صورت پویا بازنویسی یا ریدایرکت کنید.
ریدایرکت: if (pathname === '/old-path') {
return NextResponse.redirect(new URL('/new-path', req.url));
}
بازنویسی: بازنویسی URL را تغییر میدهد بدون اینکه URL نمایش داده شده در مرورگر تغییر کند.
return NextResponse.rewrite(new URL('/another-path', req.url));
۳. اقدامات بر اساس موقعیت جغرافیایی: میتوانید از req.geo
برای بررسی مکان کاربر و تغییر پاسخ استفاده کنید (برای مثال، ریدایرکت کاربران به زیر دامنههای کشور خاص).
const country = req.geo?.country || 'US';
return NextResponse.rewrite(new URL(`/${country}${pathname}`, req.url));
۴. هدرهای سفارشی و سیاستهای امنیتی: میتوانید هدرها را برای امنیت بیشتر یا نیازهای سفارشی تغییر دهید (مثل CORS یا Content Security Policy).
const response = NextResponse.next();
response.headers.set('X-Custom-Header', 'Custom Value');
return response;
۵. آزمون A/B یا فعالسازی ویژگیها: از middleware برای ارائه نسخههای مختلف از برنامه به کاربران مختلف بر اساس معیارهایی مانند کوکیهای کاربر یا مکان جغرافیایی استفاده کنید.
۶. لاگبرداری و آنالیز: Middleware میتواند برای لاگ کردن درخواستهای ورودی، رفتار کاربر یا استفاده از API قبل از ارسال پاسخ استفاده شود.
console.log(`Incoming request for ${req.url}`);
return NextResponse.next();
ویژگی config.matcher
به شما اجازه میدهد که مشخص کنید Middleware بر روی چه مسیرهایی اعمال شود. این کار باعث بهبود عملکرد میشود زیرا Middleware تنها بر روی مسیرهای مرتبط اجرا میشود.
export const config = {
matcher: ['/protected/:path*', '/dashboard/:path*'],
};
getServerSideProps
) دسترسی داشته باشید.