plebdevs/src/middleware.js

40 lines
1.2 KiB
JavaScript
Raw Normal View History

import { NextResponse } from 'next/server';
import { Ratelimit } from '@upstash/ratelimit';
import { kv } from '@vercel/kv';
const ratelimit = new Ratelimit({
redis: kv,
limiter: Ratelimit.slidingWindow(5, '10 s'),
});
export const config = {
matcher: ['/api/:path*'],
};
export default async function combinedMiddleware(request) {
const ip = request.ip ?? '127.0.0.1';
const pathname = request.nextUrl.pathname;
const vercelBypass = request.headers.get('x-vercel-protection-bypass');
// Allow access to .well-known paths
if (pathname.startsWith('/.well-known')) {
const { success } = await ratelimit.limit(ip);
return success
? NextResponse.next()
: NextResponse.redirect(new URL('/blocked', request.url));
}
// Check if the request is coming from a Vercel deployment
if (!vercelBypass) {
return new NextResponse(JSON.stringify({ error: 'Forbidden' }), {
status: 403,
headers: { 'Content-Type': 'application/json' }
});
}
// Apply rate limiting for allowed requests
const { success } = await ratelimit.limit(ip);
return success
? NextResponse.next()
: NextResponse.redirect(new URL('/blocked', request.url));
}