Angular获取客户端IP求助:内网/外网判断及X-FORWARDED_FOR疑问
如何判断用户是内网还是外网(基于请求头方案)
核心前提先明确
前端没办法直接获取用户的公网/内网IP,也不能直接读取X-FORWARDED-FOR这类请求头——这是浏览器安全策略限制,前端JS只能读取少数浏览器允许的响应头,自定义请求头除非后端配置了CORS权限,否则拿不到。
X-FORWARDED-FOR是HTTP请求头,一般由代理服务器(比如公司的网关、Nginx、CDN)添加,用来记录客户端的真实IP,格式通常是客户端IP, 代理1IP, 代理2IP,...,第一个值就是客户端的真实IP。
具体实现步骤
1. 后端配合返回IP信息
必须由后端先提取IP,再通过接口返回给前端:
- 后端优先读取
X-FORWARDED-FOR,取第一个非空的IP;如果这个头不存在,就用REMOTE_ADDR(直接连服务器的IP,没代理的话就是客户端IP) - 把提取到的IP返回给前端接口
举个Node.js后端的简单示例:
app.get('/get-client-ip', (req, res) => { // 提取真实IP,处理多代理情况 const clientIp = req.headers['x-forwarded-for']?.split(',')[0]?.trim() || req.connection.remoteAddress; res.json({ ip: clientIp }); });
2. 前端调用接口并判断内网/外网
拿到IP后,通过内网IP的规则段来判断:
常见内网IP段:
- 10.0.0.0 - 10.255.255.255
- 172.16.0.0 - 172.31.255.255
- 192.168.0.0 - 192.168.255.255
- 127.0.0.0 - 127.255.255.255(本地回环,也算内网范畴)
前端判断代码示例:
// 调用后端接口拿IP fetch('/get-client-ip') .then(res => res.json()) .then(data => { const ip = data.ip; const isIntranet = checkIsIntranet(ip); console.log(isIntranet ? '当前是内网环境' : '当前是外网环境'); }); // 封装判断内网IP的函数 function checkIsIntranet(ip) { const parts = ip.split('.').map(Number); // 先处理IPv4情况,IPv6需要单独写逻辑 if (parts.length !== 4) return false; if (parts[0] === 10) return true; if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) return true; if (parts[0] === 192 && parts[1] === 168) return true; if (parts[0] === 127) return true; return false; }
注意事项
- 如果公司有多层代理,
X-FORWARDED-FOR会有多个IP,一定要取第一个有效IP - 后端要确保代理服务器正确传递这个头,比如Nginx需要配置
proxy_set_header X-Forwarded-For $remote_addr; - 如果用户用的是IPv6,需要单独适配内网IPv6段(比如fc00::/7)
- 别尝试用WebRTC之类的前端方法拿IP,这种方法只能拿到局域网IP,还可能触发浏览器权限提示,体验差也拿不到公网IP
内容的提问来源于stack exchange,提问作者MAY
相关产品推荐
相关产品推荐

