所以我构建了一个年龄验证页面,阻止爬网程序访问主站点。然而,我添加了一些代码,这些代码应该允许爬网程序通过,而不是普通用户,如果没有为他们设置cookie的话。然而,它似乎不起作用,facebook的一个只是被重定向,我需要打开的图形信息。我去调试器,输入网站的url,它只是显示facebook爬虫被重定向了。下面的代码验证根本不起作用,所以例如,当我将浏览会话更改为googlebot时,它会被重定向。
<?php
if (!in_array($_SERVER['HTTP_USER_AGENT'], array(
'facebookexternalhit/1.0 (+https://www.facebook.com/externalhit_uatext.php)',
'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)',
'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
'msnbot/2.0b (+http://search.msn.com/msnbot.htm)'
))) {
if(!isset($_COOKIE['legal'])) {
header("Location: verify.php");
}
if($_COOKIE['legal'] == "no") {
header("Location: http://www.centurycouncil.org/");
}
}
?>
下面的代码适用于谷歌机器人和其他搜索爬虫,但不适用于脸书。如果facebooks试图抓取,facebook就会被重定向。
<?php
if((!strpos($_SERVER['HTTP_USER_AGENT'], "Googlebot")) && (!strpos($_SERVER['HTTP_USER_AGENT'], "bingbot")) && (!strpos($_SERVER['HTTP_USER_AGENT'], "Yahoo! Slurp")) && (!strpos($_SERVER['HTTP_USER_AGENT'], "facebookexternalhit")))
{
if(!isset($_COOKIE['legal'])) {
header("Location: verify.php");
}
if($_COOKIE['legal'] == "no") {
header("Location: http://www.centurycouncil.org/");
}
}
?>
您错误地使用了strpos()
,正如其文档页面上明确警告的那样:http://php.net/strpos
如果您正在搜索的字符串位于要搜索的字符串的START,则strpos()可以并且将返回合法的0
。但是PHP会将0
解释为一个错误(又称失败),也就是说你得到了错误的重定向。
你必须使用严格的比较运算符,例如
if (strpos($UA, 'facebook') !== false) {
^^^---strict operator, note the extra `=`.
它测试变量的类型AND值,而不仅仅是值。如果找不到匹配项,strpos将返回布尔值FALSE,但PHP将处理
(false == 0)
如真,在何处
(false === 0) // note the extra =
是错误的。