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

Next.js API路由调用时传递服务器IP而非客户端IP问题

解决Next.js API路由传递客户端IP至鉴权微服务的问题

问题核心

你的代码尝试通过x-forwarded-for头获取客户端IP,但存在两个关键问题:一是对x-forwarded-for的解析逻辑错误,二是Next.js部署环境可能未正确暴露真实客户端IP,导致最终传递的是服务器/代理IP。

修正方案

1. 修正IP解析逻辑

x-forwarded-for的格式为客户端IP, 代理1IP, 代理2IP,因此应该取第一个值而非最后一个。同时在Next.js App Router中,可优先使用request.ip属性(部署在Vercel等平台时会自动填充真实客户端IP):

// 优先用request.ip,fallback到x-forwarded-for的第一个值
const addressIp = request.ip || (request.headers.get('x-forwarded-for') || "").split(',').shift()?.trim() || "";

2. 配置Next.js信任代理(自部署场景)

如果是用Nginx等反向代理自行部署Next.js,需要在next.config.js中添加信任代理配置,让Next.js识别真实客户端IP:

/** @type {import('next').NextConfig} */
const nextConfig = {
  serverRuntimeConfig: {
    // 生产环境建议指定具体代理IP段,避免安全风险
    trustProxy: true,
  },
};

module.exports = nextConfig;

3. 修正后的完整代码

import { NextResponse } from 'next/server';

export async function POST(request: Request) {
  const params = await request.json();
  const userAgent = request.headers.get('user-agent') || "";
  const addressIp = request.ip || (request.headers.get('x-forwarded-for') || "").split(',').shift()?.trim() || "";

  const res = await fetch(`${process.env.API_HOST}/auth/register`, {
    method: 'POST',
    headers: {
      "Accept": "application/json",
      "Content-Type": "application/json",
      "User-Agent": userAgent,
      "X-Forwarded-For": addressIp
    },
    body: JSON.stringify(params)
  });

  const data = await res.json();

  const cookiesFromResponse = res.headers.get('set-cookie') || "";

  return NextResponse.json(data, { 
    status: res.status, 
    headers: { 'Set-Cookie': cookiesFromResponse } 
  });
}

额外注意事项

  • 部署在Vercel时,request.ip会自动返回真实客户端IP,无需额外配置;
  • 若鉴权微服务也部署在反向代理后,需在其侧同样开启X-Forwarded-For解析,否则仍会认为请求来自Next.js服务器;
  • 生产环境中trustProxy建议设置为具体的代理IP/网段,避免非法IP伪造。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:12:48