Как определить браузер пользователя

Обновлено: 07.07.2024

Предистория

Захотелось заказчику, чтобы при заходе на сайт отображался его любимый логотип с пробегающей по нему искоркой света… Уговорить отказаться от этой идеи человека я так и не смог, но в итоге мы решили, что радость эта будет отображаться только раз, и только при заходе на главную страницу. Если человек попал на сайт с поисковика, он сразу переходит на страницу. Если он руками вписывает адрес в браузер, он перенаправляется на страницу с анимацией. После успешного отображения в куки пишется маркер, и видео больше не грузится. Но… Если на сайт зайдет не человек, а поисковик, то писать себе куки он не будет. Поэтому он всегда будет натыкаться на страницу с анимацией, и в выдаче поисковиков мы себя так и не увидим. Да и зачем поисковику логотип компании видеть :)

Как можно узнать что-либо о браузере клиента

Что же делать

if(ini_get('browscap'))
//неленивые админы попались

/* старт шутки */
//вероятность выполнение участка кода стремится к нулю поэтому пишем сюда
echo "Начальство - ты меня задрало!";
/* конец шутки - всем смеяться :)*/

>
else
//используем нашу библиотеку
require_once('browscap.php');
$bc = new Browscap('path/to/the/cache/dir');
$browserInfo=$bc->getBrowser();

в результате чего получим примерно следующее
stdClass Object
(
[browser_name] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; en-us) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18
[browser_name_regex] => ^mozilla/5\.0 \(macintosh; .; .*mac os x.*\) applewebkit/.* \(.*\) version/3\.1.* safari/.*$
[browser_name_pattern] => Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*
[Parent] => Safari 3.1
[Platform] => MacOSX
[Browser] => Safari
[Version] => 3.1
[MajorVer] => 3
[MinorVer] => 1
[Frames] => 1
[IFrames] => 1
[Tables] => 1
[Cookies] => 1
[BackgroundSounds] => 1
[JavaApplets] => 1
[JavaScript] => 1
[CSS] => 2
[CssVersion] => 2
[supportsCSS] => 1
[Alpha] =>
[Beta] =>
[Win16] =>
[Win32] =>
[Win64] =>
[AuthenticodeUpdate] =>
[CDF] =>
[VBScript] =>
[ActiveXControls] =>
[Stripper] =>
[isBanned] =>
[WAP] =>
[isMobileDevice] =>
[isSyndicationReader] =>
[Crawler] =>
[AOL] =>
[aolVersion] => 0
[netCLR] =>
[ClrVersion] => 0
)

Определение браузера пользователя через PHP

Очень часто я слышу мнение, что через PHP невозможно узнать, какой браузер у пользователя, поскольку это серверный язык, а не клиентский. На самом деле, это далеко не так. Браузер - это клиент, а любой сервер имеет полное право знать информацию о клиенте, который к нему подключается, то есть о браузере. А как определить браузер через PHP, об этом Вы узнаете из этой статьи.

<?php
echo $_SERVER["HTTP_USER_AGENT"];
?>

Вывод будет примерно таким: "Opera/9.80 (Windows NT 6.1; WOW64; U; ru) Presto/2.10.289 Version/12.02", если это Opera, либо таким: "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0", если клиент - это Firefox. И так далее, в любом браузере можно увидеть некое ключевое слово. Благодаря этому ключевому слову, без проблем удаётся однозначно определить браузер:

<?php
$user_agent = $_SERVER["HTTP_USER_AGENT"];
if (strpos($user_agent, "Firefox") !== false) $browser = "Firefox";
elseif (strpos($user_agent, "Opera") !== false) $browser = "Opera";
elseif (strpos($user_agent, "Chrome") !== false) $browser = "Chrome";
elseif (strpos($user_agent, "MSIE") !== false) $browser = "Internet Explorer";
elseif (strpos($user_agent, "Safari") !== false) $browser = "Safari";
else $browser = "Неизвестный";
echo "Ваш браузер: $browser";
?>

Вот так легко определить, какой браузер у пользователя через PHP, а дальше можно, например, подгрузить определённые стили для конкретного браузера, или даже его версии.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 26 ):

Часто это спрашивают, а всё потому, что та статья написана о другом, а эта возможность упомянута там вскользь, и люди её просто не видят (как и саму статью). А теперь я буду целенаправленно отправлять сюда пользователей, чтобы максимально подробно давать ответ на данный вопрос.

Таких способов не существует. Ограничения по IP более, чем достаточно. А с куками будет ещё больше проблем у накрутчика. Тут надо понимать, что кто захочет, тот всегда накрутит. Но это вряд ли кому-то будет нужно. А от единичных бездельников, которые проголосуют 5 раз, вместо 1-го, потратив на это время в поиске новых и новых прокси, никакого вреда не будет.

Ну почему у накрутчика с куками будет больше проблем, чем со сменой айпи адреса ? Ведь чтобы айпишник сменить, придется переподключаться, что занимает время, а куки сразу можно потереть в настройках браузера. Лично я сам недавно на одном из сайтов за 7 часов проголосовал 500+ раз, просто выдернув из сайта скрипт голосования и поставив на ночь автокликер, которые переподключал сеть и обновлял скрипт и полетела вся надежность системы голосования к чертям. Все же хочется в будущем себя обезопасить от подобных изъянов.

Вообще не догоняю зачем Вам это нужно то было? И вообще какой от этого смысл. Нечем людям заняться.

Спросил, значит надо ! Например опросник на сайте создать или голосование публичное, например выбор сотрудника года, пример множество. Смысл есть во всем. Моё дело предложить тему для статьи, может свои идеи предложите, чем других критиковать ?

Я Имел ввиду зачем Вам было нужно 500+ раз голосовать за 7 часов? Какой вам от того был толк? Типа спамера?

Аааа, Pardon. Просто там был уже лидер, нужно было его обогнать по голосам, а времени в обрез.

В общем понятно. На будущее пригодятся знания. Спасибо за помощь !

echo "Ваш браузер: $browser"; Тогда уж лучше echo "Ваш браузер: "; или я не прав? Подскажите пожалуйста!

Зачем фигурные скобки? Это же не smarty.

Правильно echo "Ваш браузер: ".$browser !

Та хоч printf("Ваш браузер:%s",$browser); нічого не міняється крім функцій і синтаксису

Михаил! Опера, Сафари и Хром, кажется, работают на одном движке - этот способ в этих браузерах не работает. Или сегодня это уже не так актуально?

Ну,не совсем так.Типы клиентов разные)

В данном примере идёт сравнение имён браузеров и данных $user_agent. Слово "Safari" встречается у Оперы, Хрома и самого Сафари. А Слово "Opera" вообще не найдёт совпадений: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 OPR/22.0.1471.50 Может в ранних версиях по другому было, но сегодня этот пример не проходит.

Допишите если Internet Explore старше 10 версии, то условие будет таким elseif (strpos($user_agent, "Trident") !== false) $browser = "Internet Explorer 10";

$user_agent_browser - это ведь просто переменная, которую Вы создаёте сами, так что в моём варианте, да нужно везде писать $user_agent_browser

elseif (strpos($user_agent, "OPR") !== false) $browser = "Opera";

Скрипт определения браузера пользователя

В предыдущей статье я рассказывала о том, как можно прописать разные стили для разных браузеров.
Если интересно почитать вот ссылка.

Навигация по статье:

Для чего нужно определять браузер пользователя?

К сожалению не все браузеры одинаково отображают и поддерживают некоторые CSS свойства, к тому же у них немного отличаются алгоритмы расчёта ширины элемента, особенно если используются десятичные значения ширины или шрифта. Помимо этого они могут по разному отображают шрифты (особенно если вы используете у себя на сайте нестандартный шрифт).

Например, в Mozilla Firefox шрифт отображается более жирным, чем в Opera или Chrome, поэтому одна и та же кнопка с одной и той же надписью может иметь разное значение ширины в этих браузерах.

Из за этих особенностей порой бывает сложно добиться одинакового отображения вёрстки во всех браузерах (кроссбраузерности).

Одним из решений данной проблемы является использование так называемых CSS хаков, подробнее о которых я рассказывала в предыдущей статье.

Но у этого решения есть несколько минусов:

  • во-первых: для некоторых браузеров практически невозможно подобрать универсальный хук, который бы работал в разных версиях этого браузера;
  • во-вторых: даже если сейчас вам удалось добиться отображения нужных вам стилей в определённом браузере с помощью CSS хука, то вы не сможете быть на 100% уверенными в том, что этот хук будет корректно работать в следующих версиях браузера.

В этой статье я расскажу о скрипте определения браузера, который позволит определить браузер пользователя и подключить нужные стили для этого браузера. Это помогает добиться одинакового отображения страницы в разных браузерах, а также адаптировать вёрстку под особенности некоторых из них.

Как работает скрипт для определения браузера?

В самом конце страницы перед закрытием тега </body> мы прописываем скрипт, который считывают определённую информацию из браузера при помощи объекта navigator и метода userAgent и записывает её в определённую переменную (в моём случае «browser_id»)

Далее идёт ряд условий, в которых прописываются варианты для разных браузеров и в зависимости от того какой вариант попал в переменную browser_id в функцию будет возвращаться определённое название браузера.

Пытается определить возможности браузера пользователя, производя поиск информации о браузере в файле browscap.ini .

Список параметров

Параметр может быть пропущен, если его значение будет равно null .

Если равен true , то функция вернёт массив ( array ) вместо объекта ( object ).

Возвращаемые значения

Возвращает false , если невозможно получить информацию, например, когда параметр конфигурации browscap в php.ini не был установлен.

Примеры

<?php
echo $_SERVER [ 'HTTP_USER_AGENT' ] . "\n\n" ;

$browser = get_browser ( null , true );
print_r ( $browser );
?>

Результатом выполнения данного примера будет что-то подобное:

Примечания

Замечание:

Для работы этой функции необходимо, чтобы в установке browscap в настройках php.ini был установлен корректный путь к файлу browscap.ini в вашей системе.

browscap.ini не поставляется с PHP, но вы можете последнюю его версию здесь: » php_browscap.ini.

browscap.ini содержит информацию о большинстве браузеров, он требует обновлений для поддержания его базы актуальной Формат файла довольно очевиден.

User Contributed Notes 16 notes

This function is too slow for todays needs.

Since browser detection can be tricky and very slow, I compared a few packages.

Here are the results:

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36

Sinergi Package
---------------
Chrome 63.0.3239.84 on Windows 10.0
Took 0.0022480487823486 seconds.
---------------

WhichBrowser Package
---------------
Chrome 63 on Windows 10
Took 0.021045207977295 seconds.
---------------

Piwik Package
---------------
Chrome 63.0 on Windows 10
Took 0.079447031021118 seconds.
---------------

get_browser Package
---------------
Chrome 63.0 on Windows 10
Took 0.09611701965332 seconds.
---------------

User Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0

Sinergi Package
---------------
Firefox 57.0 on Windows 10.0
Took 0.0023159980773926 seconds.
---------------

WhichBrowser Package
---------------
Firefox 57.0 on Windows 10
Took 0.019663095474243 seconds.
---------------

Piwik Package
---------------
Firefox 57.0 on Windows 10
Took 0.079678058624268 seconds.
---------------

get_browser Package
---------------
Firefox 57.0 on Windows 10
Took 0.02236008644104 seconds.
---------------

To my surprise I found that none of the get_browser alternatives output the correct name / version combination that I was looking for using Opera or Chrome. They either give the wrong name eg Safari when in fact it should be Chrome and if the ua string includes a version number as with the latest versions of Chrome and Opera the wrong number is reported. So I took bits and pieces from the various examples and combined them and added a check for version.

<?php
function getBrowser ()
<
$u_agent = $_SERVER [ 'HTTP_USER_AGENT' ];
$bname = 'Unknown' ;
$platform = 'Unknown' ;
$version = "" ;

//First get the platform?
if ( preg_match ( '/linux/i' , $u_agent )) $platform = 'linux' ;
>
elseif ( preg_match ( '/macintosh|mac os x/i' , $u_agent )) $platform = 'mac' ;
>
elseif ( preg_match ( '/windows|win32/i' , $u_agent )) $platform = 'windows' ;
>

// Next get the name of the useragent yes seperately and for good reason
if( preg_match ( '/MSIE/i' , $u_agent ) && ! preg_match ( '/Opera/i' , $u_agent ))
<
$bname = 'Internet Explorer' ;
$ub = "MSIE" ;
>
elseif( preg_match ( '/Firefox/i' , $u_agent ))
<
$bname = 'Mozilla Firefox' ;
$ub = "Firefox" ;
>
elseif( preg_match ( '/Chrome/i' , $u_agent ))
<
$bname = 'Google Chrome' ;
$ub = "Chrome" ;
>
elseif( preg_match ( '/Safari/i' , $u_agent ))
<
$bname = 'Apple Safari' ;
$ub = "Safari" ;
>
elseif( preg_match ( '/Opera/i' , $u_agent ))
<
$bname = 'Opera' ;
$ub = "Opera" ;
>
elseif( preg_match ( '/Netscape/i' , $u_agent ))
<
$bname = 'Netscape' ;
$ub = "Netscape" ;
>

// see how many we have
$i = count ( $matches [ 'browser' ]);
if ( $i != 1 ) //we will have two since we are not using 'other' argument yet
//see if version is before or after the name
if ( strripos ( $u_agent , "Version" ) < strripos ( $u_agent , $ub )) $version = $matches [ 'version' ][ 0 ];
>
else $version = $matches [ 'version' ][ 1 ];
>
>
else $version = $matches [ 'version' ][ 0 ];
>

// check if we have a number
if ( $version == null || $version == "" )

return array(
'userAgent' => $u_agent ,
'name' => $bname ,
'version' => $version ,
'platform' => $platform ,
'pattern' => $pattern
);
>

// now try it
$ua = getBrowser ();
$yourbrowser = "Your browser: " . $ua [ 'name' ] . " " . $ua [ 'version' ] . " on " . $ua [ 'platform' ] . " reports: <br >" . $ua [ 'userAgent' ];
print_r ( $yourbrowser );
?>

If you ONLY need a very fast and simple function to detect the browser name (update to May 2016):

function get_browser_name ( $user_agent )
if ( strpos ( $user_agent , 'Opera' ) || strpos ( $user_agent , 'OPR/' )) return 'Opera' ;
elseif ( strpos ( $user_agent , 'Edge' )) return 'Edge' ;
elseif ( strpos ( $user_agent , 'Chrome' )) return 'Chrome' ;
elseif ( strpos ( $user_agent , 'Safari' )) return 'Safari' ;
elseif ( strpos ( $user_agent , 'Firefox' )) return 'Firefox' ;
elseif ( strpos ( $user_agent , 'MSIE' ) || strpos ( $user_agent , 'Trident/7' )) return 'Internet Explorer' ;

?>

This function also resolves the trouble with Edge (that contains in the user agent the string "Safari" and "Chrome"), with Chrome (contains the string "Safari") and IE11 (that do not contains 'MSIE' like all other IE versions).

Note that "strpos" is the fastest function to check a string (far better than "preg_match") and Opera + Edge + Chrome + Safari + Firefox + Internet Explorer are the most used browsers today (over 97%).

Follow up to Francesco R's post from 2016.

His function works for most human traffic; added a few lines to cover the most common bot traffic. Also fixed issue with function failing to detect strings at position 0 due to strpos behavior.

<?php
// Function written and tested December, 2018
function get_browser_name ( $user_agent )
// Make case insensitive.
$t = strtolower ( $user_agent );

// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
// "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
// http://php.net/manual/en/function.strpos.php
$t = " " . $t ;

// Humans / Regular Users
if ( strpos ( $t , 'opera' ) || strpos ( $t , 'opr/' ) ) return 'Opera' ;
elseif ( strpos ( $t , 'edge' ) ) return 'Edge' ;
elseif ( strpos ( $t , 'chrome' ) ) return 'Chrome' ;
elseif ( strpos ( $t , 'safari' ) ) return 'Safari' ;
elseif ( strpos ( $t , 'firefox' ) ) return 'Firefox' ;
elseif ( strpos ( $t , 'msie' ) || strpos ( $t , 'trident/7' )) return 'Internet Explorer' ;

// Search Engines
elseif ( strpos ( $t , 'google' ) ) return '[Bot] Googlebot' ;
elseif ( strpos ( $t , 'bing' ) ) return '[Bot] Bingbot' ;
elseif ( strpos ( $t , 'slurp' ) ) return '[Bot] Yahoo! Slurp' ;
elseif ( strpos ( $t , 'duckduckgo' ) ) return '[Bot] DuckDuckBot' ;
elseif ( strpos ( $t , 'baidu' ) ) return '[Bot] Baidu' ;
elseif ( strpos ( $t , 'yandex' ) ) return '[Bot] Yandex' ;
elseif ( strpos ( $t , 'sogou' ) ) return '[Bot] Sogou' ;
elseif ( strpos ( $t , 'exabot' ) ) return '[Bot] Exabot' ;
elseif ( strpos ( $t , 'msn' ) ) return '[Bot] MSN' ;

// Common Tools and Bots
elseif ( strpos ( $t , 'mj12bot' ) ) return '[Bot] Majestic' ;
elseif ( strpos ( $t , 'ahrefs' ) ) return '[Bot] Ahrefs' ;
elseif ( strpos ( $t , 'semrush' ) ) return '[Bot] SEMRush' ;
elseif ( strpos ( $t , 'rogerbot' ) || strpos ( $t , 'dotbot' ) ) return '[Bot] Moz or OpenSiteExplorer' ;
elseif ( strpos ( $t , 'frog' ) || strpos ( $t , 'screaming' )) return '[Bot] Screaming Frog' ;

// Miscellaneous
elseif ( strpos ( $t , 'facebook' ) ) return '[Bot] Facebook' ;
elseif ( strpos ( $t , 'pinterest' ) ) return '[Bot] Pinterest' ;

Читайте также: