getCurrentPosition 落后于 VPN - 为什么?

getCurrentPosition fails behind VPN - why?

我之前的问题: 因 "unclear" 而被关闭。说明表明我应该改写问题,但这样做后,问题仍然关闭。因此,我将用重新措辞的问题打开一个新问题。

我使用 AirVpn.org 并注意到在激活时地理定位失败:如果我关闭 VPN 客户端,下面的代码显示 'works',打开它,我得到 'The current position could not be determined'.

if (!navigator.geolocation) {
  alert('No navigator');
} else navigator.geolocation.getCurrentPosition(
      function() { alert('works'); },
      function(e) { alert(e.message); }, {
      timeout: 30000, 
      enableHighAccuracy: true, 
      maximumAge: 75000
    });

我想问的是,当通过 VPN 连接到 Internet 时,地理定位器对当前位置的请求失败的原因是什么?具体来说,我很想知道 navigator.geolocation 软件使用什么机制来确定位置,以及为什么该机制在 VPN 条件下可能无法工作

浏览器可以通过多种方式确定您的位置。如果您的设备上没有位置传感器(如 GPS),则存在多种后备方案。其中主要是通过附近的 WiFi 热点进行地理定位,如果失败,则使用基于 IP 的定位。这两个都需要有效的互联网连接,因为它们将 WiFi 标识符 and/or IP 发送到服务器并将它们解析到可能的位置。据我所知,它们还需要有效的 TLS(端口 443),因此如果您的 VPN 正在剥离 HTTPS,您可能无法获得您的位置,因为您无法获得对您关于 "where am I based on what WiFi's I can receive" 的查询的响应。

但更有可能的是,除其他外,VPN 会掩盖您的 IP 地址。因此,如果您的 "working" 地理定位仅基于 IP 地址,则在 VPN 上会失败。您可以通过其非常低的精度(通常在几十公里内)判断您的位置是基于 IP 的,而 WiFi 定位通常在几十或数百米内。这些地理定位服务变得非常智能,因此它们可能拥有 VPN 地址 "blacklisted" 并将其 IP 解析为 "unknown".

我想到的另一种可能性可能是您的 IP 和 WiFi 位置不匹配,导致模棱两可的状态再次解析为 "unknown"。

我的钱是基于这样一个事实,即您使用的是纯 IP 位置,而地理定位服务不能或不想解析您的 "masked" 地址。