我正在通过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数据(例如国家/地区代码)已存储在cookie中,且位置为“ location = US”。
但是,这是否意味着在googlebot(或其他bot)抓取或获取我的网站期间,是否会每次调用API ??因为据我所知,cookie无法存储在googlebot浏览器中,因此每次都会进行昂贵的API调用制作。所以,第一个问题是:
答案 0 :(得分:0)
从本质上来说,您的服务器要求客户端的参与不违反外部API的使用条款。这在设计上是站不住脚的。此外,虽然这可能会减少每个用户的API调用次数,但同时拥有两个以上的访问者时,您将回到同一问题。您目前的策略使不可能达到极限,但远不能解决问题。
要正确执行此操作,您的服务器应在内部缓存API结果。因此,您的服务器会记住特定IP的API答案,而不是要求客户端为您记住它。 memcache或Redis或类似的东西将是最合适的存储类型。这样,服务器还可以跟踪上次调用API的时间,并限制自身以避免超过允许的限制。更不用说您将来自同一IP的不同客户端的重复数据删除。
更恰当的是,您可能希望在服务器上安装地理位置数据库,并完全避免外部API调用。
答案 1 :(得分:0)
我同意@deceze的观点,实际上您确实需要更改方法,这样做有很多更好的方法。
但是,当您使用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