指南

为 Node 或 PHP 应用添加服务器端地理定位

对于大多数用例,包括个性化、默认设置和分析,地理定位都应该放在服务器端,因为它既不需要访客浏览器的配合,也完全不需要在客户端运行任何脚本。

请求本身

无论使用哪种语言,调用都是同样一个发往 /v1/ip 的普通 HTTP GET 请求,密钥通过请求头发送。

GET /v1/ip?ip=203.0.113.60
X-API-Key: mg_live_examplekey123
{
  "status": "ok",
  "ip": "203.0.113.60",
  "version": 4,
  "found": true,
  "country": "Netherlands",
  "country_code": "NL",
  "region": "North Holland",
  "city": "Amsterdam",
  "postcode": "1012",
  "lat": 52.3702,
  "lon": 4.8952,
  "timezone": "Europe/Amsterdam",
  "asn": 3344,
  "org": "Example ISP"
}

在 PHP 应用中

从请求中获取访客自己的地址(通常是 $_SERVER['REMOTE_ADDR']),将其作为 ip 参数传入,然后使用您的 PHP 环境已在使用的 HTTP 客户端(curl 或其封装库)发出 HTTP 请求。由于本站本身就是采用服务器端渲染的 PHP 构建、没有客户端 JavaScript,这种模式能自然地融入页面的正常渲染流程,在生成页面标记之前就能拿到位置数据。

在 Node 应用中

从传入的请求对象中读取访客地址,通常是 req.socket.remoteAddress;如果您的应用前面有反向代理,则读取代理设置的请求头,例如 X-Forwarded-For。然后在渲染响应之前,使用您选用的 HTTP 客户端发出同样的 GET 请求。

处理应用前面的代理

如果您的应用位于负载均衡器或反向代理之后,您的代码直接看到的地址可能是代理自己的地址,而不是访客的地址。请检查代理设置的转发地址请求头,并将该地址显式作为 ip 参数传入,而不要依赖连接的原始远程地址,否则定位到的将是您自己的基础设施,而不是访客。

两种方式的请求成本

无论从 PHP、Node 还是任何其他后端语言调用,查询本身都只算一次请求,因为成本取决于到达 API 的请求,而不是发起调用的程序。在任一语言中,都可以在整个会话期间缓存结果,避免每个页面都重复查询。

无论使用哪种后端语言,服务器端地理定位的方式都相同:用访客的地址发起一次 HTTP 调用。完整的认证选项请参阅认证文档,字段列表请参阅IPv4 查询文档