如何用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
相关产品推荐
相关产品推荐

