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

如何用JavaScript检测用户是否在企业内网以显示专属链接?

嘿,这个场景我太熟了!之前帮客户解决过几乎一样的问题——HTTPS网站要对内网用户显示专属链接,却卡在了本地服务器的SSL证书问题上。给你几个实用的思路,亲测可行:

方案1:内网专属DNS域名检测(最稳妥)

这个思路绕开了本地无SSL证书的问题,核心是用一个仅在企业内网DNS中配置的域名:

  • 在企业内网DNS服务器里,把一个专属域名(比如intranet-check.yourcompany.com)指向本地IIS服务器的内网IP,同时给这个域名申请合法的SSL证书(用企业域名的子域名,免费的Let's Encrypt就能搞定)。
  • 外网的公共DNS里不配置这个域名,或者指向一个无效地址。

这样,内网用户访问这个域名时会解析到本地服务器,请求能正常返回;外网用户则会解析失败或请求超时。你可以用一张1x1的透明图片作为检测资源,代码示例:

function checkIsIntranet() {
  return new Promise((resolve) => {
    const checkImg = new Image();
    // 加时间戳避免缓存影响检测结果
    checkImg.src = 'https://intranet-check.yourcompany.com/blank-pixel.png?' + Date.now();
    
    checkImg.onload = () => {
      checkImg.remove();
      resolve(true);
    };
    checkImg.onerror = () => {
      checkImg.remove();
      resolve(false);
    };
    // 超时兜底,防止内网DNS异常导致一直等待
    setTimeout(() => resolve(false), 5000);
  });
}

// 调用示例:根据检测结果显示/隐藏链接
checkIsIntranet().then(isInternal => {
  const internalLink = document.getElementById('your-internal-link');
  internalLink.style.display = isInternal ? 'block' : 'none';
});

注意事项:

  • 确保内网DNS配置正确,员工设备的DNS服务器指向企业内网DNS。
  • 给专属域名申请SSL证书时,完全合规,不会触发浏览器证书错误。
方案2:本地IP段检测(无需额外服务器配置)

如果不想折腾DNS和证书,可以通过浏览器获取本地IP,判断是否属于企业内网的私有IP段。浏览器可以通过RTCPeerConnection API获取本地IP地址,然后匹配你们企业的内网IP范围(比如常见的10.x.x.x、192.168.x.x、172.16.x.x-172.31.x.x私有网段)。

代码示例:

async function getLocalIPAddresses() {
  const ipList = [];
  const peerConnection = new RTCPeerConnection({ iceServers: [] });
  
  // 创建一个空的数据通道触发ICE候选
  peerConnection.createDataChannel('');
  await peerConnection.createOffer().then(offer => peerConnection.setLocalDescription(offer));
  
  return new Promise(resolve => {
    peerConnection.onicecandidate = (event) => {
      if (!event.candidate) {
        peerConnection.close();
        resolve([...new Set(ipList)]); // 去重后返回
        return;
      }
      // 从ICE候选中提取IP地址
      const ipMatch = event.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3})/);
      if (ipMatch && !ipList.includes(ipMatch[1])) {
        ipList.push(ipMatch[1]);
      }
    };
  });
}

function isInCompanyIntranet(ip) {
  // 替换成你们企业实际的内网IP段,这里是示例
  const allowedRanges = [
    /^10\./, // 10.x.x.x网段
    /^192\.168\.1\./, // 192.168.1.x网段
    /^172\.20\./ // 172.20.x.x网段
  ];
  return allowedRanges.some(range => range.test(ip));
}

// 使用示例
async function toggleInternalLink() {
  const ips = await getLocalIPAddresses();
  const isIntranet = ips.some(ip => isInCompanyIntranet(ip));
  document.getElementById('your-internal-link').style.display = isIntranet ? 'block' : 'none';
}

// 页面加载时执行检测
window.addEventListener('load', toggleInternalLink);

注意事项:

  • 部分浏览器可能会限制RTCPeerConnection获取IP的权限,不过大部分现代浏览器都支持。
  • 如果员工使用VPN或代理,可能会获取到非内网IP,这时候需要结合其他方式补充判断。
方案3:企业浏览器/扩展辅助(适合大型企业)

如果你们企业有统一部署的浏览器(比如Chrome企业版)或内部浏览器扩展,可以通过扩展的API直接检测内网环境——扩展不受HTTPS同源策略和证书问题的限制,甚至可以直接读取本地文件、系统注册表等信息来判断是否在企业内网。

这个方案需要企业IT部门配合部署扩展,但稳定性最高,适合员工设备统一管理的场景。


内容的提问来源于stack exchange,提问作者VinZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:10