在Node.js的Express框架中如何获取客户端完整IP地址,当前仅返回::1
解决方案
你当前获取到的
::1是IPv6协议下的本地回环地址,等价于IPv4的127.0.0.1,属于本地访问服务时的正常结果,并非代码逻辑错误。
不同场景下的IP获取方法如下:
- 本地测试验证
本地测试时不要使用localhost访问服务,改用你设备的局域网IP(比如192.168.x.x格式的地址)访问,此时就能正常获取到你的局域网IP地址。 - 反向代理部署场景配置
如果你的服务后续部署在Nginx、CDN等反向代理服务后面,需要先开启Express的代理信任配置,在初始化app后添加一行代码:
开启后app.set('trust proxy', true)req.ip会自动解析代理传递的真实客户端IP,而非代理服务器的IP。 - 手动兜底获取方案
你也可以通过请求头和连接属性手动拼接兜底逻辑,兼容不同部署场景:const getClientIp = (req) => { // 优先取反向代理传递的真实IP const xForwardedFor = req.headers['x-forwarded-for'] if (xForwardedFor) { // X-Forwarded-For格式为: 客户端IP, 代理1IP, 代理2IP... 取第一个即可 return xForwardedFor.split(',')[0].trim() } // 兜底取socket连接的远程地址、req.ip return req.socket.remoteAddress || req.ip }
修改后的完整index.js示例:
const express = require('express') const app = express() // 开启代理信任,反向代理部署场景必加 app.set('trust proxy', true) const getClientIp = (req) => { const xForwardedFor = req.headers['x-forwarded-for'] if (xForwardedFor) { return xForwardedFor.split(',')[0].trim() } return req.socket.remoteAddress || req.ip } const middleware = (req, _, next) => { console.log('客户端IP:', getClientIp(req)) next() } app.get("/*",middleware, (req, res) => { res.send("Hello") }) app.listen(3000,() => console.log("Server started"))
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

