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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:43:34