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

Node.js Nest.js前后端分离场景下如何获取真实客户端IP地址

可以在不修改前端业务代码的前提下实现,你拿到前端服务IP的核心原因是请求经过前端服务/反向代理转发时没有透传客户端真实IP头,同时Nest侧没有开启代理信任配置,按以下步骤调整即可:

1. 配置Nest服务代理信任

Nest基于Express运行时,需要先开启trustProxy配置,让框架信任来自代理的请求头,从X-Forwarded-For等字段读取真实IP而非直接取TCP连接的源IP。
在main.ts中修改实例化逻辑:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    // 生产环境建议指定信任的代理IP段,如['192.168.1.0/24', '前端服务IP'],避免IP被伪造
    trustProxy: true
  });
  await app.listen(3000);
}
bootstrap();

配置完成后可以直接在控制器中通过@Ip()装饰器获取真实IP,无需额外解析:

import { Controller, Get, Ip } from '@nestjs/common';

@Controller('test')
export class TestController {
  @Get('ip')
  getClientIp(@Ip() ip: string) {
    return {
      clientIp: ip
    };
  }
}

你也可以手动从Request对象中读取req.ip或req.ips(多层代理场景下返回所有经过的代理IP数组,最后一个为真实客户端IP)。

2. 配置前端侧代理/服务的IP头透传

根据你的前端部署场景,对应配置透传规则即可,不需要修改React业务代码:

场景1:前端用Nginx部署静态资源/做反向代理

在Nginx的站点配置中添加转发头规则:

location /api/ {
  proxy_pass http://你的后端Nest服务地址;
  proxy_set_header Host $host;
  # 传递真实客户端IP
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}

修改后重启Nginx生效。

场景2:前端用Node服务做SSR/请求转发(如Next.js、自定义Node转发层)

在转发请求的逻辑中,透传入站请求的IP头:

// 示例为axios转发,其他请求库逻辑一致
const axios = require('axios');

async function forwardRequest(req) {
  const realIp = req.socket.remoteAddress;
  const forwardedFor = req.headers['x-forwarded-for'] 
    ? `${req.headers['x-forwarded-for']}, ${realIp}` 
    : realIp;
  
  return axios({
    method: req.method,
    url: `http://后端服务地址${req.path}`,
    data: req.body,
    headers: {
      ...req.headers,
      'X-Real-IP': realIp,
      'X-Forwarded-For': forwardedFor
    }
  });
}

场景3:前端部署在CDN服务商

登录对应CDN控制台开启「客户端IP回源透传」功能,不同厂商的配置项名称可能为「携带真实IP回源」、「X-Forwarded-For透传」,开启后CDN会自动将用户真实IP添加到请求头中转发到后端。

本地开发场景(Vite/Webpack代理)

如果是本地开发阶段用构建工具的代理转发请求,在代理配置中添加头信息即可:

// vite.config.ts 示例
export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        headers: {
          'X-Real-IP': '127.0.0.1'
        }
      }
    }
  }
})

注意事项

生产环境不要直接将trustProxy设置为true,建议填写你信任的代理IP段,防止恶意用户伪造X-Forwarded-For头获取非法权限。

内容的提问来源于stack exchange,提问作者Mohammad Yaser Ahmadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:39:00