You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13如何获取客户端IP?request-ip返回null问题

解决Next.js 13 App Router中获取客户端IP的问题

问题原因

request-ip库是为Express等传统Node.js HTTP框架设计的,而Next.js 13 App Router中的req是Web标准的Request对象,并非Express的Request实例,导致getClientIp方法无法正确解析IP信息,返回null。

解决方案

方案1:手动解析请求头(推荐)

客户端IP通常会通过反向代理注入到x-forwarded-for或x-real-ip请求头中,直接读取这些头即可获取IP:

import { NextResponse } from "next/server";

export async function GET(req) {
  // 优先读取x-forwarded-for(多代理场景下第一个IP为客户端真实IP)
  const ipHeader = req.headers.get('x-forwarded-for') || req.headers.get('x-real-ip');
  // 处理x-forwarded-for可能包含多个IP的情况(用逗号分隔)
  const clientIp = ipHeader?.split(',')[0]?.trim();

  const data = {
    ok: true,
    ip: clientIp || '无法获取IP',
    userAgent: req.headers.get("user-agent"),
  };
  return NextResponse.json(data, { status: 200 });
}

方案2:适配request-ip库

将Web标准Request对象转换为request-ip能识别的格式(模拟Express Request的headers结构):

import { NextResponse } from "next/server";
import requestIp from "request-ip";

export async function GET(req) {
  // 将Web Request的headers转换为普通对象
  const wrappedRequest = {
    headers: Object.fromEntries(req.headers.entries())
  };
  const detectedIp = requestIp.getClientIp(wrappedRequest);

  const data = {
    ok: true,
    ip: detectedIp || '无法获取IP',
    userAgent: req.headers.get("user-agent"),
  };
  return NextResponse.json(data, { status: 200 });
}

部署平台注意事项

  • 本地开发:获取到的IP通常是::1(IPv6)或127.0.0.1(IPv4),属于正常现象。
  • Vercel/Netlify等托管平台:x-forwarded-for头会被平台正确设置,直接读取即可。
  • 自部署(如Nginx):需要在Nginx配置中添加反向代理头,将真实IP传递给Next.js:
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    

内容的提问来源于stack exchange,提问作者Nusab19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:15:01