надежное обнаружение браузера пользователя с помощью php


Попытка определить браузер пользователя только с помощью PHP, является ли $_SERVER['HTTP_USER_AGENT'] надежным способом? Должен ли я вместо этого выбрать функцию get_browser? какой из них, по вашему мнению, приносит более точные результаты?

Если этот метод прагматичен, не рекомендуется ли использовать его для вывода соответствующих CSS-ссылок, например:

if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false)
   echo '<link type="text/css" href="mozilla.css" />';

Я заметил этот вопрос , однако я хотел уточнить, подходит ли это для CSS-ориентированных обнаружение.

ОБНОВЛЕНИЕ: что-то действительно подозрительное: я попробовал echo $_SERVER['HTTP_USER_AGENT']; на IE 7, и вот что он вывел:

Mozilla/4.0 (совместимый; MSIE 7.0; Windows NT 6.0; SLCC1; СРЕДА CLR .NET 2.0.50727; Медиа-центр PC 5.0; Среда CLR .NET 3.5.30729; Среда CLR .NET 3.0.30618)

Safari тоже выдал что-то странное с "mozilla" в нем. Что это дает?

Author: Community, 2010-02-13

9 answers

Используя существующий метод (т. е. get_browser) вероятно, это лучше, чем писать что-то самостоятельно, так как оно имеет (лучшую) поддержку и будет обновляться более новыми версиями. Там также могут быть полезные библиотеки для надежного получения идентификатора браузера.

Расшифровать $_SERVER['HTTP_USER_AGENT'] сложно, так как многие браузеры имеют довольно похожие данные и склонны (неправильно) использовать их в своих собственных интересах. Но если вы действительно хотите их расшифровать, вы могли бы использовать информацию о этом страница для всех доступных идентификаторов агентов. Эта страница также показывает, что ваш пример вывода действительно принадлежит IE 7. Более подробную информацию о полях в самом идентификаторе агента можно найти на этой странице, но, как я уже сказал, браузеры, как правило, используют его для своих собственных целей, и он может быть (немного) в другом формате.

 16
Author: Veger, 2010-02-13 13:28:00

Проверьте этот код, я обнаружил, что это полезно. Не проверяйте Mozilla , потому что большинство браузеров используют это как строку агента пользователя

if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
   echo 'Internet explorer';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) //For Supporting IE 11
    echo 'Internet explorer';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== FALSE)
   echo 'Mozilla Firefox';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE)
   echo 'Google Chrome';
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== FALSE)
   echo "Opera Mini";
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE)
   echo "Opera";
 elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== FALSE)
   echo "Safari";
 else
   echo 'Something else';
 56
Author: Ekramul Hoque, 2013-12-19 10:22:58
class Browser { 
    /** 
    Figure out what browser is used, its version and the platform it is 
    running on. 

    The following code was ported in part from JQuery v1.3.1 
    */ 
    public static function detect() { 
        $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']); 

        // Identify the browser. Check Opera and Safari first in case of spoof. Let Google Chrome be identified as Safari. 
        if (preg_match('/opera/', $userAgent)) { 
            $name = 'opera'; 
        } 
        elseif (preg_match('/webkit/', $userAgent)) { 
            $name = 'safari'; 
        } 
        elseif (preg_match('/msie/', $userAgent)) { 
            $name = 'msie'; 
        } 
        elseif (preg_match('/mozilla/', $userAgent) && !preg_match('/compatible/', $userAgent)) { 
            $name = 'mozilla'; 
        } 
        else { 
            $name = 'unrecognized'; 
        } 

        // What version? 
        if (preg_match('/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/', $userAgent, $matches)) { 
            $version = $matches[1]; 
        } 
        else { 
            $version = 'unknown'; 
        } 

        // Running on what platform? 
        if (preg_match('/linux/', $userAgent)) { 
            $platform = 'linux'; 
        } 
        elseif (preg_match('/macintosh|mac os x/', $userAgent)) { 
            $platform = 'mac'; 
        } 
        elseif (preg_match('/windows|win32/', $userAgent)) { 
            $platform = 'windows'; 
        } 
        else { 
            $platform = 'unrecognized'; 
        } 

        return array( 
            'name'      => $name, 
            'version'   => $version, 
            'platform'  => $platform, 
            'userAgent' => $userAgent 
        ); 
    } 
} 


$browser = Browser::detect(); 
 6
Author: user1524615, 2012-10-03 13:43:01

Если stripos($_SERVER['HTTP_USER_AGENT'], "mozilla")!==ложь)

Это бесполезный тест, почти каждый браузер идентифицирует себя как Mozilla.

Является ли $_SERVER['HTTP_USER_AGENT'] надежным способом?

Нет.

Должен ли я вместо этого выбрать функцию get_browser?

Нет.

Обнюхивание браузера на стороне сервера - проигрышная игра. Помимо всех проблем, связанных с попытками проанализировать строку UA, браузеры, которые лежат, неясные браузеры и возможность того, что заголовка вообще нет, если вы возвращаете другое содержимое страницы для другого браузера, вы должны установить заголовок Vary, чтобы включить User-Agent, в противном случае прокси-серверы кэширования могут вернуть неправильную версию страницы в неправильный браузер.

Но если вы добавите Vary: User-Agent сломанный код кэширования IE, он запутается и каждый раз перезагружает страницу. Так что ты не можешь победить.

Если вам необходимо выполнить поиск в браузере, это можно сделать на стороне клиента, используя JavaScript и, в частности, в случае IE, условные комментарии. К счастью, именно IE поддерживает условные комментарии, так как именно для этого браузера вам часто нужны обходные пути. (См. Ответ Сканлиффа для наиболее распространенной стратегии.)

 3
Author: bobince, 2010-02-13 13:39:57

Агент пользователя может быть подделан, и лучше не зависеть от строки агента пользователя, а затем вы можете использовать медиа-запросы CSS3, если вы хотите только определить ориентацию (вы можете изучить CSS известной начальной загрузки адаптивной платформы, чтобы проверить, как вы можете обрабатывать часть ориентации с помощью CSS)

Вот немного CSS:

    @media only screen and (max-width: 999px) {
     /* rules that only apply for canvases narrower than 1000px */
    }

    @media only screen and (device-width: 768px) and (orientation: landscape) {
    /* rules for iPad in landscape orientation */
    }

    @media only screen and (min-device-width: 320px) and (max-device-width: 480px) {
    /* iPhone, Android rules here */
    }    

Подробнее: Об обнаружении ориентации CSS

ИЛИ вы можете найти ориентацию с помощью JavaScript:

    // Listen for orientation changes
    window.addEventListener("orientationchange", function() {
        // Announce the new orientation number
        alert(window.orientation);
    }, false);

Читать далее : Об определении ориентации с помощью JS

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

<?php
class BrowserDetection {

    private $_user_agent;
    private $_name;
    private $_version;
    private $_platform;

    private $_basic_browser = array (
       'Trident\/7.0' => 'Internet Explorer 11',
    'Beamrise' => 'Beamrise',
    'Opera' => 'Opera',
    'OPR' => 'Opera',
    'Shiira' => 'Shiira',
    'Chimera' => 'Chimera',
    'Phoenix' => 'Phoenix',
    'Firebird' => 'Firebird',
    'Camino' => 'Camino',
    'Netscape' => 'Netscape',
    'OmniWeb' => 'OmniWeb',
    'Konqueror' => 'Konqueror',
    'icab' => 'iCab',
     'Lynx' => 'Lynx',
    'Links' => 'Links',
    'hotjava' => 'HotJava',
    'amaya' => 'Amaya',
    'IBrowse' => 'IBrowse',
    'iTunes' => 'iTunes',
    'Silk' => 'Silk',
    'Dillo' => 'Dillo', 
    'Maxthon' => 'Maxthon',
    'Arora' => 'Arora',
    'Galeon' => 'Galeon',
    'Iceape' => 'Iceape',
    'Iceweasel' => 'Iceweasel',
    'Midori' => 'Midori',
    'QupZilla' => 'QupZilla',
    'Namoroka' => 'Namoroka',
    'NetSurf' => 'NetSurf',
    'BOLT' => 'BOLT',
    'EudoraWeb' => 'EudoraWeb',
    'shadowfox' => 'ShadowFox',
    'Swiftfox' => 'Swiftfox',
    'Uzbl' => 'Uzbl',
    'UCBrowser' => 'UCBrowser',
    'Kindle' => 'Kindle',
    'wOSBrowser' => 'wOSBrowser',
     'Epiphany' => 'Epiphany', 
    'SeaMonkey' => 'SeaMonkey',
    'Avant Browser' => 'Avant Browser',
    'Firefox' => 'Firefox',
    'Chrome' => 'Google Chrome',
    'MSIE' => 'Internet Explorer',
    'Internet Explorer' => 'Internet Explorer',
     'Safari' => 'Safari',
    'Mozilla' => 'Mozilla'  
    );

     private $_basic_platform = array(
        'windows' => 'Windows', 
     'iPad' => 'iPad', 
      'iPod' => 'iPod', 
    'iPhone' => 'iPhone', 
     'mac' => 'Apple', 
    'android' => 'Android', 
    'linux' => 'Linux',
    'Nokia' => 'Nokia',
     'BlackBerry' => 'BlackBerry',
    'FreeBSD' => 'FreeBSD',
     'OpenBSD' => 'OpenBSD',
    'NetBSD' => 'NetBSD',
     'UNIX' => 'UNIX',
    'DragonFly' => 'DragonFlyBSD',
    'OpenSolaris' => 'OpenSolaris',
    'SunOS' => 'SunOS', 
    'OS\/2' => 'OS/2',
    'BeOS' => 'BeOS',
    'win' => 'Windows',
    'Dillo' => 'Linux',
    'PalmOS' => 'PalmOS',
    'RebelMouse' => 'RebelMouse'   
     ); 

    function __construct($ua = '') {
        if(empty($ua)) {
           $this->_user_agent = (!empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT'));
        }
        else {
           $this->_user_agent = $ua;
        }
       }

    function detect() {
        $this->detectBrowser();
        $this->detectPlatform();
        return $this;
    }

    function detectBrowser() {
     foreach($this->_basic_browser as $pattern => $name) {
        if( preg_match("/".$pattern."/i",$this->_user_agent, $match)) {
            $this->_name = $name;
             // finally get the correct version number
            $known = array('Version', $pattern, 'other');
            $pattern_version = '#(?<browser>' . join('|', $known).')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
            if (!preg_match_all($pattern_version, $this->_user_agent, $matches)) {
                // we have no matching number just continue
            }
            // 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($this->_user_agent,"Version") < strripos($this->_user_agent,$pattern)){
                    @$this->_version = $matches['version'][0];
                }
                else {
                    @$this->_version = $matches['version'][1];
                }
            }
            else {
                $this->_version = $matches['version'][0];
            }
            break;
        }
       }
   }

    function detectPlatform() {
      foreach($this->_basic_platform as $key => $platform) {
            if (stripos($this->_user_agent, $key) !== false) {
                $this->_platform = $platform;
                break;
            } 
      }
    }

   function getBrowser() {
      if(!empty($this->_name)) {
           return $this->_name;
      }
   }        

   function getVersion() {
       return $this->_version;
    }

    function getPlatform() {
       if(!empty($this->_platform)) {
          return $this->_platform;
       }
    }

    function getUserAgent() {
        return $this->_user_agent;
     }

     function getInfo() {
         return "<strong>Browser Name:</strong> {$this->getBrowser()}<br/>\n" .
        "<strong>Browser Version:</strong> {$this->getVersion()}<br/>\n" .
        "<strong>Browser User Agent String:</strong> {$this->getUserAgent()}<br/>\n" .
        "<strong>Platform:</strong> {$this->getPlatform()}<br/>";
     }
}  

$obj = new BrowserDetection();

echo $obj->detect()->getInfo();

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

 2
Author: Jay, 2017-05-23 10:30:59

Я думаю, что полагаться на агента пользователя немного слабо, так как он может (и часто подделывается).

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

<link type="text/css" rel="stylesheet" href="styles.css"/><!--for all-->
<!--[if IE]>
  <link type="text/css" rel="stylesheet" href="ie_styles.css"/>
<![endif]-->

Или, если вы просто хотите один для IE6:

<!--[if IE 6]>
  <link type="text/css" rel="stylesheet" href="ie6_styles.css"/>
<![endif]-->

Поскольку это комментарий, он игнорируется браузерами... за исключением IE, который загружает его, если тест if соответствует текущему браузеру.

 1
Author: scunliffe, 2010-02-13 13:32:55

Старый пост все еще появляется в Google. get_browser() - лучшее решение, но редактирование php.ini может оказаться невозможным. Согласно этому сообщению вы не можете ini_set свойство browscap. Так что же остается? phpbrowscap похоже, что работа выполнена. Документы не очень хороши, поэтому, если вы не хотите, чтобы они автоматически обновлялись (по умолчанию включено), вам нужно установить

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL;
$bc->localFile = __DIR__ . "/php_browscap.ini";
 1
Author: Robert Labrie, 2017-05-23 10:30:59
Check This Code :      
   <?php     

class OS_BR{    
private $agent = "";
private $info = array();

function __construct(){
    $this->agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : NULL;
    $this->getBrowser();
    $this->getOS();
}     
function getBrowser(){     
    $browser = array("Navigator"            => "/Navigator(.*)/i",
                     "Firefox"              => "/Firefox(.*)/i",
                     "Internet Explorer"    => "/MSIE(.*)/i",
                     "Google Chrome"        => "/chrome(.*)/i",
                     "MAXTHON"              => "/MAXTHON(.*)/i",
                     "Opera"                => "/Opera(.*)/i",
                     );
    foreach($browser as $key => $value){
        if(preg_match($value, $this->agent)){
            $this->info = array_merge($this->info,array("Browser" => $key));
            $this->info = array_merge($this->info,array(
              "Version" => $this->getVersion($key, $value, $this->agent)));
            break;
        }else{
            $this->info = array_merge($this->info,array("Browser" => "UnKnown"));
            $this->info = array_merge($this->info,array("Version" => "UnKnown"));
        }
    }
    return $this->info['Browser'];
}
function getOS(){
    $OS = array("Windows"   =>   "/Windows/i",
                "Linux"     =>   "/Linux/i",
                "Unix"      =>   "/Unix/i",
                "Mac"       =>   "/Mac/i"
                );

    foreach($OS as $key => $value){
        if(preg_match($value, $this->agent)){
            $this->info = array_merge($this->info,array("Operating System" => $key));
            break;
        }
    }
    return $this->info['Operating System'];
}

function getVersion($browser, $search, $string){
    $browser = $this->info['Browser'];
    $version = "";
    $browser = strtolower($browser);
    preg_match_all($search,$string,$match);
    switch($browser){
        case "firefox": $version = str_replace("/","",$match[1][0]);
        break;

        case "internet explorer": $version = substr($match[1][0],0,4);
        break;

        case "opera": $version = str_replace("/","",substr($match[1][0],0,5));
        break;

        case "navigator": $version = substr($match[1][0],1,7);
        break;

        case "maxthon": $version = str_replace(")","",$match[1][0]);
        break;

        case "google chrome": $version = substr($match[1][0],1,10);
    }
    return $version;
}

function showInfo($switch){
    $switch = strtolower($switch);
    switch($switch){
        case "browser": return $this->info['Browser'];
        break;

        case "os": return $this->info['Operating System'];
        break;

        case "version": return $this->info['Version'];
        break;

        case "all" : return array($this->info["Version"], 
          $this->info['Operating System'], $this->info['Browser']);
        break;

        default: return "Unkonw";
        break;

    }
}
 }    


$obj = new OS_BR();

echo $obj->showInfo('browser');

echo $obj->showInfo('version');

echo $obj->showInfo('os');

echo "<pre>".print_r($obj->showInfo("all"),true)."</pre>"; 

 ?>
 0
Author: Jumper Pot, 2015-02-18 12:44:43

@Ekramul Хок был на правильном пути, но в его ответе есть несколько недостатков.

Прежде всего, я бы начал с Edge, поскольку Internet Explorer не содержит термин Edge ни в одном из своих пользовательских интерфейсов.

if(strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

Затем продолжайте работать в обратном направлении, поскольку более ранние версии IE не использовали движок Trident и, следовательно, не будут содержать его в своем UA.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {
  echo '<link type="text/css" href="ms.css" />';

Далее нам нужно настроить таргетинг на браузеры iOS, чтобы последующие запросы не мешали этому. Все iOS браузеры используют webkit, за исключением Opera Mini, который выполняет его рендеринг с удаленного сервера, а не с устройства. Это означает, что мы можем нацелить ОС в UA с помощью iOS и исключить UA, которые содержат Opera.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iOS') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE {
  echo '<link type="text/css" href="webkit.css" />';

Затем перейдите к браузерам Firefox. Хотя использование Firefox для поискового запроса будет работать, он будет идентифицировать только браузеры Firefox, а не браузеры на основе Firefox. Firefox содержит Gecko в своем UA, поскольку Gecko - это движок, который он использует, и поэтому мы можем нацелиться на это. Используя Gecko, мы можем идентифицировать все браузеры, работающие на движке Gecko (т.Е. SeaMonkey). Однако многие браузеры используют термин like Gecko по соображениям совместимости, поэтому мы должны быть уверены, что он соответствует Gecko, а не like Gecko.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') && !strpos($_SERVER['HTTP_USER_AGENT'], 'like Gecko') !== FALSE) {
  echo '<link type="text/css" href="moz.css" />';

Двигаясь дальше, мы определим браузеры Opera. Opera использовала движок Presto до конца версии 12. Начиная с v15, они начали использовать двигатель Blink, такой как Chrome. v12 и более ранние версии содержали два уникальных слова в UA, которых нет в v15+ - Opera и Presto. Вы можете нацеливаться любой из них, поскольку они всегда присутствовали вместе. Для версии 15 Opera начала использовать OPR в UA.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Presto') !== FALSE) {
  echo '<link type="text/css" href="o.css" />';
} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'OPR') !== FALSE) {
  echo '<link type="text/css" href="normal.css" />';

Следующий шаг - Сафари. Safari использует AppleWebKit в качестве своего движка рендеринга, но мы не можем просто ориентироваться на это, потому что Chrome также включает в свой UA AppleWebKit и Safari по соображениям совместимости. Поэтому нам нужно искать AppleWebKit, а не Chrome.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'AppleWebKit') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE) {
  echo '<link type="text/css" href="webkit.css" />';

Наконец, мы добираемся до Chrome. Chrome использовал AppleWebKit до версии 27. С выпуском v28 они переключились на мигание двигатель. Мы могли бы нацелиться на оба движка, но для этого потребуется много кода. Поскольку Chrome сейчас почти до v70, мы просто будем искать Chrome, так как маловероятно, что кто-то все еще использует версию Chrome для webkit.

} elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE {
  echo '<link type="text/css" href="normal.css" />';

И последнее, но не менее важное, ваш запасной вариант/еще.

} else {
  echo '<link type="text/css" href="normal.css" />';
}

Теперь я использовал css-файлы, ссылающиеся на префикс поставщика, для таргетинга здесь. Не стесняйтесь настраивать это по мере необходимости, чтобы он делал то, что вам нужно. Я надеюсь, что это помогло.

 0
Author: Angeliss44, 2018-04-20 21:42:40