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
相关产品推荐
相关产品推荐

