传递用户代理通过验证不能正常工作

时间:2013-08-16 17:35:03

标签: php facebook user-agent verificationexception

所以我建立了一个年龄验证页面,阻止抓取工具进入主站点。但是,我添加了一些代码,如果没有为它们设置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/");
    }
}

?>

以下代码适用于googlebot和其他搜索抓取工具,但它不适用于Facebook。如果facebook试图爬行,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/");
    }

}
?>

1 个答案:

答案 0 :(得分:1)

您误用了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)

为真,wherease

(false === 0) // note the extra =

是假的。