34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
import { NextRequest } from 'next/server';
|
|
|
|
/**
|
|
* Extract client IP address from Next.js request headers
|
|
*
|
|
* This function handles various proxy and forwarding scenarios:
|
|
* - Vercel's x-forwarded-for header (may contain multiple IPs)
|
|
* - x-real-ip header (direct client IP)
|
|
* - Fallback for development environments
|
|
*
|
|
* @param request - Next.js request object
|
|
* @returns Client IP address as a string, or 'unknown-ip' as fallback
|
|
*/
|
|
export function getClientIp(request: NextRequest): string {
|
|
// Check Vercel's forwarded IP header first
|
|
// In production, this is the most reliable source
|
|
const forwardedFor = request.headers.get('x-forwarded-for');
|
|
if (forwardedFor) {
|
|
// x-forwarded-for may contain multiple IPs in format: "client, proxy1, proxy2"
|
|
// The first IP is the original client IP
|
|
return forwardedFor.split(',')[0].trim();
|
|
}
|
|
|
|
// Check for real IP header (used by some proxies and load balancers)
|
|
const realIp = request.headers.get('x-real-ip');
|
|
if (realIp) {
|
|
return realIp;
|
|
}
|
|
|
|
// Fallback to a default identifier for development environments
|
|
// or when headers are not available
|
|
return 'unknown-ip';
|
|
}
|