验证Googlebot

时间:2010-06-20 01:20:18

标签: php protection bots googlebot

除了大搜索引擎外,我将阻止所有机器人。我的一种阻止方法是检查“语言”:接受语言:如果它没有接受语言,机器人的IP地址将被阻止,直到2037年.Googlebot没有Accept-Language,我想用DNS验证它查找

<?php
gethostbyaddr($_SERVER['REMOTE_ADDR']);
?>

使用gethostbyaddr是否可以,有人可以通过我的“gethostbyaddr保护”吗?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

//The function
function is_google() {
    return strpos($_SERVER['HTTP_USER_AGENT'],"Googlebot");
}

答案 2 :(得分:2)

Google推荐的方法是进行反向dns查找(gethostbyaddr)以获取关联的主机名然后将该名称解析为IP(gethostbyname)并将其与remote_addr进行比较(因为反向查找可能是伪造的,也是)。

但要注意,结束lokups需要时间,可能会严重减慢您的网页速度(可能先检查用户代理)。

请参阅https://webmasters.googleblog.com/2006/09/how-to-verify-googlebot.html

答案 3 :(得分:2)

function detectSearchBot($ip, $agent, &$hostname)
{
    $hostname = $ip;

    // check HTTP_USER_AGENT what not to touch gethostbyaddr in vain
    if (preg_match('/(?:google|yandex)bot/iu', $agent)) {
        // success - return host, fail - return ip or false
        $hostname = gethostbyaddr($ip);

        // https://support.google.com/webmasters/answer/80553
        if ($hostname !== false && $hostname != $ip) {
            // detect google and yandex search bots
            if (preg_match('/\.((?:google(?:bot)?|yandex)\.(?:com|ru))$/iu', $hostname)) {
                // success - return ip, fail - return hostname
                $ip = gethostbyname($hostname);

                if ($ip != $hostname) {
                    return true;
                }
            }
        }
    }

    return false;
}

在我的项目中,我使用此功能来识别Google和Yandex搜索机器人。

detectSearchBot函数的结果是缓存。

该算法基于Google的推荐-https://support.google.com/webmasters/answer/80553

答案 4 :(得分:1)

除了克里斯蒂安的回答:

function is_valid_google_ip($ip) {

    $hostname = gethostbyaddr($ip); //"crawl-66-249-66-1.googlebot.com"

    return preg_match('/\.googlebot|google\.com$/i', $hostname);
}

function is_valid_google_request($ip=null,$agent=null){

    if(is_null($ip)){

        $ip=$_SERVER['REMOTE_ADDR'];
    }

    if(is_null($agent)){

        $agent=$_SERVER['HTTP_USER_AGENT'];
    }

    $is_valid_request=false;

    if (strpos($agent, 'Google')!==false && is_valid_google_ip($ip)){

        $is_valid_request=true;
    }

    return $is_valid_request;
}