React与Node.js技术栈下如何获取提交表单用户的IP地址(无需外部API)
Node.js 后端获取用户真实IP地址可行方案
原有代码失效原因
你当前写法未生效的核心原因是:
- 如果你的服务部署在反向代理(Nginx、CDN、云服务商网关、Serverless平台)之后,
req.socket.remoteAddress拿到的是代理服务器的IP,而非用户真实IP x-forwarded-for头是多级代理传递时会追加IP形成逗号分隔的列表,直接读取整个头得不到正确的原始用户IP- Node.js 主流Web框架默认不信任代理传递的头,需要手动开启信任配置
具体实现步骤
1. 配置框架信任代理
以常用的Express、Koa框架为例:
- Express 框架添加配置:
const express = require('express') const app = express() // 开启信任代理,会自动解析代理传递的IP相关头 app.set('trust proxy', true)
- Koa 框架配置:
const Koa = require('koa') const app = new Koa() // 开启信任代理 app.proxy = true
2. 兼容多场景的IP获取函数
优先读取代理传递的头,逐层降级获取,同时处理x-forwarded-for的多IP情况:
const getClientIp = (req) => { // 处理x-forwarded-for头,取最左侧的原始用户IP const xForwardedFor = req.headers['x-forwarded-for'] if (xForwardedFor) { const ipList = xForwardedFor.split(',').map(ip => ip.trim()) // 过滤空值后取第一个 const validIp = ipList.find(ip => ip) if (validIp) return validIp } // 兼容其他常见代理头 return req.headers['x-real-ip'] || req.socket?.remoteAddress || req.connection?.remoteAddress || req.connection?.socket?.remoteAddress } // 调用示例 const ip = getClientIp(req) console.log('client ip', ip)
3. 反向代理配置(自行部署Nginx时需要添加)
如果你的服务前自己搭建了Nginx反向代理,需要在Nginx配置的对应location块中添加如下配置,保证头正确传递到Node.js服务:
location / { proxy_pass http://你的Node.js服务地址; proxy_set_header Host $host; 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; }
注意事项
- 本地开发环境访问时,获取到的IP为
::1(IPv6本地回环)或127.0.0.1属于正常现象,部署到公网环境后会自动获取到用户公网IP - 如果是多级代理部署,可根据你的代理层数调整
trust proxy的配置,例如app.set('trust proxy', 2)代表信任前2层代理,避免IP被伪造
内容的提问来源于stack exchange,提问作者sudesh sharma
相关产品推荐
相关产品推荐

