Node.js项目中无法获取正确客户端IP的问题排查求助
解决Node.js云部署环境下获取客户端IP显示127.0.0.1的问题
问题本质:你部署的云平台几乎都用了反向代理(比如Nginx、Cloudflare),你的Node.js服务实际是和代理服务器建立连接,所以
req.socket.remoteAddress拿到的是代理服务器的本地IP(也就是127.0.0.1),而非真实客户端IP。修复方法:
- 云平台的反向代理会把真实客户端IP放在请求头里,常用的是
X-Forwarded-For或X-Real-IP,直接从这些头里取值即可。 - 修改中间件代码,优先读取代理传递的IP:
async function getUserIp(req, res, next) { // 优先取X-Forwarded-For,多层代理时第一个值是真实IP const clientIp = (req.headers['x-forwarded-for'] || '').split(',')[0].trim() || req.headers['x-real-ip'] || req.socket.remoteAddress; console.log(clientIp); next(); } - 确认云平台配置:部分云平台需要手动开启传递真实IP的设置,比如用Nginx做代理时,要在配置里加
proxy_set_header X-Forwarded-For $remote_addr;,像Cloudflare这类CDN默认会自动传递相关请求头。
- 云平台的反向代理会把真实客户端IP放在请求头里,常用的是
补充说明:
req.socket.remoteAddress只能获取直接连接到Node.js服务的对象IP,当有反向代理时,这个对象是代理服务器,所以拿到的是127.0.0.1,这不是代码疏漏,是云平台的代理环境导致的。
内容的提问来源于stack exchange,提问作者MrMars
相关产品推荐
相关产品推荐

