除了大搜索引擎外,我将阻止所有机器人。我的一种阻止方法是检查“语言”:接受语言:如果它没有接受语言,机器人的IP地址将被阻止,直到2037年.Googlebot没有Accept-Language,我想用DNS验证它查找
<?php
gethostbyaddr($_SERVER['REMOTE_ADDR']);
?>
使用gethostbyaddr
是否可以,有人可以通过我的“gethostbyaddr保护”吗?
答案 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;
}