我们运行社交/本地服务,受益于对用户 IP 的地理定位。问题在于,使用 IPv6 时,地理定位比使用 IPv4 时要复杂得多。
在带有 nginx 的 Ubuntu 主机上,有没有办法更喜欢通过 IPv6 的传入连接?配置如下所示:
server {
listen 80 default_server;
listen [::]:80 ipv6only=off default_server;
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*ton 23
IPv6/IPv4 优先级由连接的发起者(即 Web 浏览器)决定。地址选择规则在RFC 6724中定义。虽然这些可以被覆盖,但只能由用户重新配置他们的操作系统。
强迫某人使用 IPv4的唯一方法是根本不提供 IPv6。显然,即使在中期,这也不是一个实用的解决方案......
所以,让我们回到最初的问题:IPv6 的地理定位“比 IPv4 更复杂”。
在某种程度上,这在很大程度上取决于您从何处获取地理定位数据。例如,Maxmind 只给出我的 IPv6 地址为“美国”,根本没有城市和一组有趣的坐标,而谷歌至少正确地识别了距离它们仍然大约 50 英里的大都市区。Maxmind 和 Google 都允许报告更正,至少对于 Maxmind来说,任何人都可以对任何 IP 地址执行此操作。
我不希望这种情况持续很长时间。随着 IPv6 使用量的不断扩大,此类地理定位服务的用户将要求 IPv6 地址具有更高的准确性,并且他们最终必须交付它,至少对于付费客户而言,以免这些客户流向其他地方。
同时,您应该确保您的应用程序有其他方法来定位用户。如果他们登录,您可以阅读他们现有的帐户以获取有关他们位置的线索。您可以要求用户明确选择一个国家。等等...
您可以做的另一件事是为您的网站提供一个纯 IPv4 子域和一个纯 IPv6 子域,您的页面会尝试加载每个子域。然后,您可以将它们关联到客户端并向服务器报告。并非巧合的是 Maxmind 已经在他们自己的网站上这样做了。
kas*_*erd 15
这种偏好可以使用 SRV 记录来表达。不幸的是,HTTP 不支持这些。因此,您会面临这样一种情况,即客户端独自在 IPv4 和 IPv6 之间做出选择。
许多客户端使用 SYN + SYN-ACK 的往返时间来决定使用两者中的哪一个。因此,通过减慢在 IPv6 上发送 SYN-ACK 数据包的速度,您可以使大多数客户端更喜欢 IPv4。但是故意放慢您的网站速度是一种糟糕的方法。
相反,我会退后一步,看看问题。您需要更好的地理位置数据。每次访问者访问您的网站时,您都会立即了解他们的 IP 地址之一。这将是 IPv4 地址还是 IPv6 地址取决于他们的浏览器更喜欢与您的服务器进行通信的方式。
在您的页面内,您可以使用 AJAX 请求来了解另一个 IP 地址。对于使用 IPv4 的客户端,将 AJAX 请求发送到纯 IPv6 域,对于使用 IPv6 的客户端,将 AJAX 请求发送到纯 IPv4 域。
AJAX 请求一到达服务器,您就知道用户的 IPv4 和 IPv6 地址。了解这种对应关系将使您能够比只知道两者之一更好地进行地理定位。
您经常会看到 AJAX 请求从未到达服务器的情况。对于这些用户,您将不得不进行地理定位,因为您最好仅基于一个 IP 地址进行定位。但是只要对那个 AJAX 请求的回复没有用于客户端的任何事情,用户甚至不会注意到那些失败的 AJAX 请求。因此,AJAX 请求不会导致明显的减速或不稳定的行为。