Проходящий пользовательский агент проходит проверку не работает идеально

Поэтому я создал страницу проверки возраста, которая блокирует доступ сканеров к основному сайту. Однако я добавил некоторый код, который должен позволять сканеру проходить, а не обычным пользователям, если для них не установлен файл 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 ответ

Решение

Вы неправильно используете strpos(), как явно предупреждено на странице документа: http://php.net/strpos

strpos () может и вернет законный 0 если искомая строка находится в начале строки искомой. Но PHP будет интерпретировать это 0 как ложное (иначе провал), что вы получаете ваши плохие перенаправления.

Вы должны использовать операторы строгого сравнения, например

if (strpos($UA, 'facebook') !== false) {
                            ^^^---strict operator, note the extra `=`.

которые проверяют тип и значение переменной, а не только значение. strpos вернет логическое значение FALSE, если совпадение не найдено, но PHP обрабатывает

(false == 0)

как верно, где

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

ложно

Другие вопросы по тегам