我通过 PHP 使用 ipinfodb API,在其中获取 JSON 格式的地理位置响应并将其存储在 cookie 中。我使用 cookie,以便下次访问者访问该网站时,无需再次调用 API,因为 ipinfodb API 限制每秒超过两次 API 调用。一切都很顺利,但我对一件事感到困惑和困惑。
当我在 Google 网站管理员工具中以 GoogleBot 身份获取时,我得到了此标头响应 -
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 06 Jul 2018 11:40:02 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: location=US; expires=Sat, 06-Jul-2019 11:40:02 GMT; path=/; httponly
Cache-Control: max-age=0
Expires: Fri, 06 Jul 2018 11:40:01 GMT
Vary: Accept-Encoding,User-Agent
我知道这个响应是正确的并且工作正常,IPinfodb 数据(例如国家/地区代码)已作为“location=US”存储在 cookie 中。
但是,这是否意味着,在googlebots(或其他机器人)抓取或获取我的网站期间,每次都会调用API?因为据我所知,cookie无法存储在googlebot浏览器中,因此每次都会进行昂贵的API调用。所以,第一个问题是:
您本质上需要客户端参与,这样您的服务器才不会违反外部 API 的使用条款。这在设计上是相当站不住脚的。此外,虽然这可能会减少每个用户的 API 调用数量,但一旦有两个以上同时访问者,您就会回到同一问题。您当前的策略使其“不太可能”达到极限,但远未解决问题。 要正确执行此操作,您的服务器应在内部缓存 API 结果。因此,您的服务器会记住特定 IP 的 API 答案,而不是要求客户端为您记住它。 memcache 或 Redis 或类似的东西将是最合适的存储类型。这样,服务器还可以跟踪上次调用 API 的时间,并限制自身以避免超出允许的限制。更不用说您从同一 IP 删除不同客户端的重复工作。
更正确的是,您可能希望在服务器上安装地理位置数据库并完全避免外部 API 调用。
但是,当您在 PHP 中调用 API 并且您的具体目标不是为 Googlebot 调用它时,很容易贴上创可贴。
我需要对网站的访问设置一些地理限制,但又不想阻止 Googlebot,因此我掌握了它使用的 IP 地址列表。我是个好人,所以我会分享,它们是 CIDR 格式,所以你必须解决这个问题。然后,您只需告诉您的脚本不要调用 API(如果它来自其中之一)。
64.233.160.0/19
66.102.0.0/20
66.249.64.0/19
72.14.192.0/18
74.125.0.0/16
209.85.128.0/17
216.239.32.0/19
54.187.174.169/32
54.187.205.235/32
54.187.216.72/32
54.241.31.99/32
54.241.31.102/32
54.241.34.107/32
50.18.212.157/32
50.18.212.223/32
52.25.214.31/32
52.26.11.205/32
52.26.14.11/32
52.8.19.58/32
52.8.8.189/32
54.149.153.72/32
54.187.182.230/32
54.187.199.38/32
54.187.208.163/32
54.67.48.128/32
54.67.52.245/32
54.68.165.206/32
54.68.183.151/32
107.23.48.182/32
107.23.48.232/32