V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ASpiral
V2EX  ›  问与答

前端怎么判断当前连接的网络是内网还是外网?

  •  
  •   ASpiral · 2019-03-08 16:30:29 +08:00 · 6261 次点击
    这是一个创建于 2081 天前的主题,其中的信息可能已经有所发展或是发生改变。

    外包项目,前后端分离,前端纯 H5,打包后放到指定的 app 里,类似微信小程序;
    后台部署在对方内部服务器,前端通过内网地址向后台发起请求,手机需要连接内网 wifi 才能使用该小程序。

    对方要求手机连外网时也能使用,于是找对方申请外网访问权限,通过端口映射访问内网;
    前端改成 公网 ip+端口 请求后台,结果手机连外网可以使用,内网就用不了了…
    项目经理在群里 @我(前端)让我解决问题:判断当前手机连的网络是内网还是外网,内网用内网地址,外网用外网地址。
    我一下子就懵了,这前端能做得到吗?

    一开始想到的是通过 ajax 请求超时来判断,但这样子从进入首页到请求超时这段时间页面就没数据显示了;
    目前的解决方法是进入首页后先同时向内外网地址发起请求,哪个先响应后续的所有请求就用该地址;
    总感觉这样不妥,后续业务扩展这问题可能还会暴露出来;
    我觉得这问题不该由前端来解决,但跟项目经理解释不清,所以想请教下,纯前端要怎么判断当前网络是内网还是外网?

    26 条回复    2019-03-09 18:53:04 +08:00
    leo108
        1
    leo108  
       2019-03-08 16:52:53 +08:00
    调用 API 的思路没有问题,只要同时发起两个 API 请求即可,哪个先返回正确的数据就知道是哪个网咯。
    nfroot
        2
    nfroot  
       2019-03-08 17:27:23 +08:00
    内网是啥?外网是啥?你分得清么?

    估计你也分不清,其实哪来的内网,哪来的外网……

    你这个需求明明是“我在 XXX 企业内网”和“我不在 XXX 企业内网”,一般人连内网外网都分不清,哪来的区分啊,还得判断是不是在指定的内网。

    简单来说 2 种解决办法吧:
    1.这个东西应该在对方企业的路由或三层交换机上指定策略路由、路由,没走错接口,内网外网都应该是可以访问到该企业的外网 IP。程序上不需要区分什么内网外网。不应该存在不能访问的情况。存在不能访问的情况,就是路由、策略路由设置错啦。把那个搞 IT 的抓起来打屁股。

    2.在你的 WEB 目录下放一个极小的图片,我用 PS 做了个 1 像素的图片,才 49 字节!!!开启程序的时候同时加载 2 个地址的这个图片,谁先加载成功,就走哪个,这个不难吧?而且延迟也会很小!还搞什么 ajax,太麻烦了!直接搞 2 个 img,谁先 onload 就走谁。简单吧?

    PS:这个工作说起来不是你前端做,但是后端更是做不了的。。。。其实根本的原因就是它是网络设置错了才会这样
    nfroot
        3
    nfroot  
       2019-03-08 17:32:17 +08:00
    作为一个主职管 ERP 的,二三层交换懂一点,桌面运维懂一点,数据库懂一点,前端懂一点,后端也懂一点,工厂怎么运作的懂一点,财务也懂一点。。。

    也是个蛋疼
    zenxds
        4
    zenxds  
       2019-03-08 17:36:45 +08:00
    用 we'brtc 采集到当前的 IP,然后根据格式判断是内网还是外网
    maichael
        5
    maichael  
       2019-03-08 17:54:29 +08:00
    @zenxds #4 client 在内网又不表示和 server 在同一个内网。
    maichael
        6
    maichael  
       2019-03-08 17:56:06 +08:00
    你这种方法我觉得没有问题,你可以把判断内外网封装成一个方法,然后写成用 promise.all 之类的并且写成阻塞的方式,在页面刚进入的时候做这操作就好了,不影响扩展性。
    kisara
        7
    kisara  
       2019-03-08 17:57:47 +08:00
    很简单 在公网架设一个服务器 从本机获取一下 ip 在从服务器上查询一下本机 ip 看看一致不一致就行了
    Yourshell
        8
    Yourshell  
       2019-03-08 17:59:46 +08:00
    改下内网 DNS 不就好了么
    maichael
        9
    maichael  
       2019-03-08 18:00:51 +08:00   ❤️ 1
    @maichael #6 promise.race
    ASpiral
        10
    ASpiral  
    OP
       2019-03-08 18:22:21 +08:00
    @nfroot 就是分不清所以来发问啊…我找对方管理网络的人求助,他跟你一样说一堆我不了解的专业名词,最后怪我水平不行让我找其他前端解决…
    gamexg
        11
    gamexg  
       2019-03-08 18:59:33 +08:00 via Android
    两个都试试,哪个能用用哪个。
    另外内网无法用外网地址,应该是对方路由未设好。
    yhxx
        12
    yhxx  
       2019-03-08 19:11:01 +08:00
    改域名解析不能解决吗?
    580a388da131
        13
    580a388da131  
       2019-03-08 20:23:25 +08:00 via iPhone
    既然是放在 app 里面,要求 app 传递一下网络情况不就好了?
    cpdyj0
        14
    cpdyj0  
       2019-03-08 21:27:55 +08:00
    这叫啥需求,应当甩锅给网管……
    Jex
        15
    Jex  
       2019-03-08 21:30:05 +08:00
    nfroot
        16
    nfroot  
       2019-03-08 21:51:16 +08:00   ❤️ 1
    @ASpiral
    1.正常来说,既然公网 IP 映射了端口,那就必然能在所有联了互联网的机器访问,包括任何公司、家联网的设备。你说的对方内网访问不了,这是不合理的,除非是被内部限制了网络,不准上网的机器(这种就只能靠你去解决了,就比如你主题中的方法,再优化也差不多,就是这样了,别想了,再想也无用,后端也没办法解决,只有你解决)
    2.无限制的情况下,只能是路由 /策略路由指错了接口,否则根本就不存在访问不了的情况。这个就要对方管网络的去解决。但是你的主题里没有提到这部分。
    3.上面有一些错误的回复。或者说通过更复杂的技术,但反而很难准确判断,原因我前面的回复也说了。
    ThirdFlame
        17
    ThirdFlame  
       2019-03-08 22:36:20 +08:00
    显然是出口设备(简称路由器) ,对于内网设备访问路由器 wan 口映射地址时出错导致的。 此问题 已知华为部分防火墙就有,而且无法解决。
    总的来说 属于网络问题,非前端 /后端问题。
    ASpiral
        18
    ASpiral  
    OP
       2019-03-08 23:04:25 +08:00
    @maichael 我一开始直接在原来的代码里改,看起来好糟,怕影响后续业务扩展,看来得把这部分代码单独封装起来…
    ASpiral
        19
    ASpiral  
    OP
       2019-03-08 23:06:24 +08:00
    @yhxx 内网可以访问域名,但加了端口就不行,我跟后台都不懂,对方网管对我们爱理不理,感觉作为外包不是很受待见…
    ASpiral
        20
    ASpiral  
    OP
       2019-03-08 23:16:19 +08:00
    @ThirdFlame 前端显示不出数据,项目经理就认为是前端的问题,我对网络这块不了解没办法跟经理解释清楚,感觉做外包沟通好麻烦= =
    myzyq
        21
    myzyq  
       2019-03-08 23:27:22 +08:00 via iPhone
    感觉域名解析靠谱!
    Acoffice
        22
    Acoffice  
       2019-03-08 23:41:33 +08:00 via Android   ❤️ 1
    @ASpiral 你内外网访问地址不一致?比如外网访问是 112.x.x.x:8080 内网直接访问 192.168.1.2 ?
    -----
    正常来说,如果内外端口一致,内网有上网权限,是不会访问不了的.
    域名同理,如果内网有 DNS 服务器,且指定了域名对应的内网地址,那内网无上网权限也没有影响.
    autoxbc
        23
    autoxbc  
       2019-03-09 00:08:52 +08:00   ❤️ 1
    这个问题的术语叫 NAT 回流,对方好沟通的话让网管处理
    greatbody
        24
    greatbody  
       2019-03-09 09:58:26 +08:00
    @leo108 赞同。
    aunox
        25
    aunox  
       2019-03-09 11:01:47 +08:00
    前提:在内网时,不能访问外网。
    在第三方不给你提供帮助的情况下,#2 的解决方案里面第二种是比较靠谱的。只要判断内网图片能不能访问就行了,内网 IP 路由没几跳,这个错误响应速度是很快的,对于使用者来说应该是无感知的,公网下载图片就不要测试了。
    sampeng
        26
    sampeng  
       2019-03-09 18:53:04 +08:00 via iPhone
    这明显要甩锅给甲方的网络环境…关你们屁事昂。合同有写么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2861 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.