如何在Vercel Edge Functions中获取客户端IP地址?
在Vercel Edge Function中获取客户端IP的正确方式
问题根源
你代码里误用了Next.js传统API的NextApiRequest/NextApiResponse类型,但Vercel Edge Runtime的函数参数是标准Web Request对象,这才是导致所有请求头返回undefined的核心原因。
修正后的代码
替换参数类型为Web标准Request,并使用headers.get()方法获取头信息:
export const config = { runtime: "edge", }; export default async function handler(request: Request) { // 获取客户端IP相关请求头 const realIp = request.headers.get("x-real-ip"); const forwardedFor = request.headers.get("x-forwarded-for"); const vercelForwardedFor = request.headers.get("x-vercel-forwarded-for"); const ipCountry = request.headers.get("x-vercel-ip-country"); console.log("realip", realIp); console.log("forwardedfor", forwardedFor); console.log("vercelforwardedfor", vercelForwardedFor); console.log("x-vercel-ip-country", ipCountry); return new Response( JSON.stringify({ data: { data: "ok", clientIp: vercelForwardedFor || forwardedFor || realIp, country: ipCountry }, }), { status: 200, headers: { "content-type": "application/json" }, } ); }
关键说明
- Edge Runtime完全遵循Web标准,必须使用
Request/Response而非Next.js专属类型 x-vercel-forwarded-for是Vercel提供的专属头,直接返回客户端真实IP(若存在代理,第一个IP即为客户端IP)- 本地开发环境中这些头可能不会被注入,建议部署到Vercel线上环境测试真实效果
内容的提问来源于stack exchange,提问作者GorvGoyl
相关产品推荐
相关产品推荐

