指南

添加根据 IP 设置默认值的国家下拉菜单

国家下拉菜单如果默认选中访客 IP 地址所指向的国家,就能让大多数人省去在长列表中滚动查找的麻烦,前提是当默认值不对时,仍允许他们修改。

获取默认值

在页面被请求时,在服务器上查询访客的 IP 地址,并读取响应中的 country_code 字段,在页面发送到浏览器之前就将其设为下拉菜单的选中项。

GET /v1/ip?ip=192.0.2.15
{
  "status": "ok",
  "ip": "192.0.2.15",
  "version": 4,
  "found": true,
  "country": "Spain",
  "country_code": "ES",
  "region": "Madrid",
  "city": "Madrid",
  "postcode": "28001",
  "lat": 40.4168,
  "lon": -3.7038,
  "timezone": "Europe/Madrid",
  "asn": 5678,
  "org": "Example Networks"
}

在服务器端渲染

由于这一切完全在服务器端、在页面渲染之前完成,浏览器中不会先闪现一个错误的默认值再被纠正,而在页面加载后才发起调用的客户端方案就会出现这种情况。直接在您生成的 HTML 中为匹配的选项设置 selected 属性,将 country_code 与您的选项值已经使用的 ISO 代码进行匹配。

第二个示例:预填结账页面的国家字段

同样的调用在结账页面上和在注册表单上一样好用。在结账页面加载时查询一次购物者的 IP,将 country_code 与您的配送国家列表匹配,并默认选中。由于配送国家会影响页面下方显示的税费和配送选项,在页面渲染之前就把它设对,可以避免访客在页面其余内容已围绕错误的默认值加载完毕后再去修改,从而导致页面突兀地重新排版。

始终允许修改

把基于 IP 的国家当作起点,而不是锁定的答案。正在旅行的访客、使用公司 VPN 的访客,或者所在地与其网络服务商注册地址不符的访客,都需要选择其他选项,因此表单的任何部分都不应假定默认值是正确的。

需要避免的常见错误

不要在未按访客区分的情况下,把完整渲染的页面缓存在 CDN 或反向代理后面,因为一个按第一位访客的 IP 渲染一次、之后从缓存提供给所有人的页面,会向随后的每一位访客显示第一位访客的国家,而不管他们实际身在何处。如果您的页面有任何缓存,要么将这一片段排除在缓存之外,要么通过每次请求都会运行的小型服务器端包含来渲染它。

处理查询不到结果的情况

如果 found 返回 false(某些私有或未分配的地址段会出现这种情况),请回退到一个中性的默认值,例如空选项或您最常见的国家,而不是让该字段处于未定义状态。

IPv6 访客的处理方式相同

通过 IPv6 连接的访客从同一个端点得到同样的 country_code 字段,只是按 /48 网络而不是 /24 网络解析。下拉菜单的逻辑无需因请求使用的 IP 版本而做任何改变。如需了解特定版本的细节,请参阅 IPv6 查询文档

此功能的成本

每个新访客会话只需一次请求,并在会话期间缓存,因此一次访问不会在多个表单页面之间触发重复查询。这样一来,除了访问量最大的网站之外,此功能都能完全控制在每个密钥包含的每天 2,500 次免费请求之内,不使用密钥时单个地址也同样享有这一额度。

一个合理的默认值可以省去在上百项的列表中滚动查找,而如果猜错了,访客仍然拥有完全的控制权。字段详情见 IPv4 查询文档