Всё о web

Для чайников и не только


Правильные белые списки для google/yandex ботов

Апрель 22, 2017

Типичное решение для этой задачи - посмотреть логи и взять от туда ip поисковых роботов, либо ещё хуже- найти список адресов в интернетах. Но это ошибочный путь, потому что адреса серверов меняются, и нам придётся постоянно следить за актуальностью списка.

Right way

Правильный путь- вести белый список не ip адресов, а доменов. Мы можем зарезолвить доменное имя сервера по ip, и уже потом решить что с этим делать. То, что это единственно верный способ, говорится и в официальном руководстве google.

Например, так можно реализовать проверку на PHP:

<?php 

$whiteList = [
  'google.com' => true,
  'googlebot.com' => true,
  'yandex.ru' => true,
  'yanedx.com' => true,
  'yandex.net' => true
];

function checkWhitelist($ip, $whiteList) {
  $host = gethostbyaddr($ip);
  if( $host == $ip ) // Нет никакого домена на этом ip
    return false;
  
  // извлекаем главный домен
  $hostParts = explode('.', $host);
  $primaryDomain = $hostParts[count($hostParts) -2] . '.' . $hostParts[count($hostParts) -1];
  
  if( isset($whiteList[$primaryDomain]) )
    return true;
    
  return false;
}

echo "Whitelisted? - " . checkWhitelist('66.249.66.1', $whiteList) . "\n";
?>

Ну и то же самое на Nodejs:

var dns = require('dns');

var whiteList = {
  'google.com': true,
  'googlebot.com': true,
  'yandex.ru': true,
  'yanedx.com': true,
  'yandex.net': true  
};

function checkWhitelist(ip, cb) {
  dns.reverse(ip, function(err, domains) {
    if( err ) {
      cb(false);
      return;
    } else {
      var hostParts = domains[0].split('.');
      var primaryDomain = hostParts[hostParts.length -2] + '.' + hostParts[hostParts.length -1];
      if( whiteList[primaryDomain] ) {
        cb(true)
        return;
      } else {
        cb(false);
        return;
      }
    }
  })
  
}

checkWhitelist('66.249.66.1', function(result) {
  console.log('Result:', result)
})


Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *