为什么用了 VPN,网站仍然知道你在哪座城市
网站可以分别使用浏览器定位权限和你的公网 IP:检查来源站点的权限、系统设置以及已保存的城市。
有两种机制能把城市显示在屏幕上,而只有一种关心你的 VPN 从哪里出去。浏览器定位 API 在页面获得权限时返回设备位置,而 IP 查询则根据请求到达的地址估算地区。当隧道在另一个国家运行时,网站仍显示你真实所在的城市,通常是在用第一种机制,或者读取了几个月前存下的城市。五个步骤可以区分这些情况。
第一步:判断可能是哪种机制
先问页面究竟可能知道什么。设备定位需要调用 API 并经过权限决定,会给出精确坐标。IP 估算不需要用户做任何事,最多给出城市,而且经常是错的。账户里保存的偏好两者都不需要,并且能经受每次网络变化。
这三种来源几乎能解释所有报告。以你所在街道为中心的地图网站用的是定位 API。用错误语言向你问候的商店用的是 IP 估算。搬家之后仍显示老家的新闻网站用的是账户保存的信息。
| What the page shows | Likely source |
|---|---|
| Street-level accuracy | Device position from the Geolocation API |
| City or region only | IP geolocation of the exit address |
| Same city for months | Stored account preference |
| Different result in a private window | Stored permission or cached state |
第二步:查看该来源站点的定位权限
浏览器会按来源记住权限决定,所以去年允许过的站点打开时不会再询问。要在浏览器的站点设置里查看那个具体站点的位置条目,而不是全局默认值,因为全局设置只决定没有任何记录时会发生什么。
接着检查操作系统。现代电脑或手机上的浏览器还需要系统层面的定位权限,系统权限被拒绝时,即使站点已获允许,定位 API 也会失败。可用的位置可能来自系统服务,而系统服务与隧道毫无关系。
两个技术条件能解释大多数看起来像 VPN 问题的失败。定位 API 需要安全上下文,普通 HTTP 页面根本用不了;嵌入式框架还可能被页面的权限策略拦住。所以请求被拒绝,往往更多是浏览器或页面策略的结果,而不是网络造成的。
第三步:用新请求确认出口地址
用你正在测试的同一个浏览器,问一个独立服务它看到什么地址。过期的标签页、service worker 或缓存页面可能报告昨天的答案,把新响应与站点显示的内容对比,就能排除这种怀疑。
curl -s https://ifconfig.me
curl -s https://ipinfo.io/json
在电脑上而不是路由器上运行这些命令,记录各自返回的地址和国家。如果两者都报告 VPN 所在国家,而站点仍显示你的老家,那么出口不是原因,剩下的可能是权限、已保存的数据和泄露路径。
泄露路径是第三种可能:自带网络栈的浏览器扩展、把站点送出隧道之外的拆分隧道路由,或者隧道不承载的 IPv6 路径。每一种都能在请求本身看到,所以先查出口,再改设置。人们最容易忽略的是自带代理设置的扩展,因为它可以让单个标签页绕过隧道。
第四步:查看账户已保存的信息
撤销权限只影响浏览器规则下未来的访问,并不会删除服务已经保存的位置。已保存的老家、收货地址或个人资料地区会一直保留,直到应用更新它,而站点仍然可以根据出口地址做粗略估算。
在断定是浏览器的错之前,先找站点自己的位置控件。很多应用都保留手动地区选择器,它会覆盖所有自动估算;而客服读取账户记录时看到的是那个值,不是你当前的连接。
如果保存的值很重要,就在账户里改掉它并记下日期。等旧城市再次出现时,你就有了第二个数据点。改动之前截一张账户页面的图,比事后描述更有价值。
第五步:一次只改一个变量
按固定顺序测试:新的出口检查、来源权限、系统权限、账户设置,然后换一个浏览器配置。一次改好几项会让原因无法辨认,五分钟的答案就这样变成一周的猜测。
记下你改了什么,以及之后页面显示了什么。如果只在隐私窗口里显示不同,原因是保存的状态;如果从不改变,说明页面用的是 IP 估算或浏览器无法影响的账户值。把前后对照写在同一条记录里,因为模式本身就是证据。
结论要诚实:VPN 改变的是请求到达时的地址,而定位 API 是另一条需要授权的通道,隧道碰不到它。两件事可以同时成立,大多数令人困惑的报告,都是把它们当成了二选一。