Answers:
IPv6 / IPv4首选项由连接的发起者(即Web浏览器)确定。地址选择规则在RFC 6724中定义。尽管可以覆盖这些内容,但这仅是由用户重新配置其操作系统来完成的。
强迫某人使用IPv4 的唯一方法是完全不提供IPv6。显然,即使从中期来看,这也不是一个切实可行的解决方案。
因此,让我们回到最初的问题:IPv6的地理位置“比IPv4的定位更重要”。
在某种程度上,这很大程度上取决于您从何处获取地理位置数据。例如,Maxmind仅给出了我的IPv6地址为“美国”,根本没有城市,并且显示了一组有趣的坐标,而Google至少正确地识别了距该城市大约50英里的大都市区。Maxmind和Google都允许报告更正,至少对于Maxmind,任何人都可以针对任何IP地址执行此操作。
我不希望这种情况持续很长时间。随着IPv6使用的不断扩展,此类地理定位服务的用户将要求对IPv6地址具有更高的准确性,并且最终将必须交付这些结果(至少对于付费客户而言),以免这些客户转到其他地方。
同时,您应该确保您的应用程序还有其他方式可以找到用户。如果他们登录,则可以阅读其现有帐户以获取有关其位置的线索。您可以要求用户明确选择一个国家。等等...
您可以做的另一件事是提供网站的仅IPv4子域和仅IPv6子域,您的页面将尝试加载其中的每个子域。然后,您可以将它们与客户端相关联,并向服务器报告。并非偶然,Maxmind已经在自己的网站上进行了此操作。
可以使用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请求不会导致任何可察觉的速度下降或行为异常。