Как запретить поисковым роботам вызывать API каждый раз - PullRequest
0 голосов
/ 06 июля 2018

Я использую API ipinfodb через PHP, где я получаю ответ о геолокации в JSON и сохраняю в cookie. Я использую cookie, чтобы в следующий раз, когда посетитель зашел на сайт, больше не нужно было снова вызывать API, поскольку API ipinfodb ограничивает более двух вызовов API в секунду. Все работает очень хорошо, но я застрял и запутался в одной вещи.

Когда я получаю GoogleBot в инструментах Google для веб-мастеров, я получаю этот заголовок ответа -

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".

Но означает ли это, что во время сканирования или выборки моего сайта google-ботами (или другими ботами) будет ли API вызываться каждый раз? сделал. Итак, первый вопрос:

  1. API будет вызываться каждый раз, когда googlebot сканирует мой сайт?
  2. Или каким-то образом, боты не вызывают API, тогда как ответ хранится в cookie?
  3. Или боты вызывают API только один раз как обычный пользователь?
  4. Как я могу запретить Googlebot вызывать API при каждом посещении?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

Я согласен с @deceze, что вам действительно нужно изменить свой подход, есть гораздо лучшие способы сделать это.

Однако, так как вы вызываете API в PHP, и ваша конкретная цель не состоит в том, чтобы вызывать его для робота-робота, достаточно просто надеть полосовую помощь.

Мне нужно было установить некоторые географические ограничения на доступ к сайту, но я не хотел блокировать робота Google, поэтому я получил список их 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
0 голосов
/ 06 июля 2018

Вы по своей сути требуете от клиента участия здесь, чтобы ваш сервер не нарушал условия использования внешнего API. Это довольно несостоятельно по замыслу. Кроме того, хотя это может уменьшить количество вызовов API для отдельного пользователя, но если у вас более двух одновременных посетителей, вы вернулись к одной и той же проблеме. Ваша текущая стратегия делает менее вероятным достижение лимита, но это далеко не решает проблему.

Чтобы сделать это правильно, ваш сервер должен внутренне кэшировать результаты API. Таким образом, ваш сервер запоминает ответ API для определенного IP-адреса, а не требует, чтобы клиент запомнил его для вас. memcache или Redis или что-то в этом роде было бы наиболее подходящим типом хранилища. Таким образом, сервер также может отслеживать, когда он последний раз вызывал API, и регулировать сам, чтобы избежать превышения допустимого предела. Не говоря уже о том, что вы дедуплицируете работу для разных клиентов с одного и того же IP.

Еще точнее, вы можете захотеть установить базу данных геолокации на вашем сервере и вообще избегать внешних вызовов API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...