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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:57:02