zuverlässige Benutzer-Browser-Erkennung mit php

Lesezeit: 11 Minuten

zuverlassige Benutzer Browser Erkennung mit php
Gal

Der Versuch, den Browser eines Benutzers nur mit PHP zu erkennen, ist $_SERVER[‘HTTP_USER_AGENT’] ein zuverlässiger Weg? Sollte ich mich stattdessen für die entscheiden get_browser Funktion? Welche bringt Ihrer Meinung nach genauere Ergebnisse?

Wenn diese Methode pragmatisch ist, ist es nicht ratsam, sie zum Ausgeben relevanter CSS-Links zu verwenden, zum Beispiel:

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

Ich habe diese Frage bemerkt, wollte jedoch klären, ob dies für eine CSS-orientierte Erkennung gut ist.

AKTUALISIEREN:
etwas wirklich Verdächtiges: Ich habe es versucht echo $_SERVER['HTTP_USER_AGENT']; auf IE 7 und das ist, was es ausgibt:

Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

Safari gab auch etwas Seltsames mit “mozilla” darin. Was gibt?

  • Das “Mozilla/4.0”-Bit ist aus Legacy-Gründen drin … sogar in IE8.

    – Schnauze

    13. Februar 2010 um 13:30 Uhr

  • IE bezeichnet sich seit einiger Zeit als Mozilla 4.0. Ich habe gelesen, dass sie dies aus Kompatibilitätsgründen getan haben, aber ich kann die Quelle gerade nicht finden. Wenn ich raten müsste, würde ich sagen, das ist ein Überbleibsel aus der NetScape/IE-Zeit.

    – Bobbi

    13. Februar 2010 um 13:31 Uhr

  • User-Agent ist nicht zuverlässig. Aber es ist der einzige Weg, es zu erraten.

    – Gumbo

    13. Februar 2010 um 13:35 Uhr

  • @Bobby webaim.org/blog/user-agent-string-history

    – Knü

    17. Februar 2010 um 0:51 Uhr

  • Funktioniert ohne Probleme mit der neuesten Version von Firefox.

    – Benutzer198989

    16. Mai 2013 um 7:17 Uhr

zuverlassige Benutzer Browser Erkennung mit php
Ekramul Hoque

Überprüfen Sie diesen Code, ich habe festgestellt, dass dies nützlich ist. Überprüfen Sie nicht Mozilla, da die meisten Browser dies als Zeichenfolge für den Benutzeragenten verwenden

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';

  • Funktioniert nicht für IE 11 (siehe hier: nczonline.net/blog/2013/07/02/… )

    – rap-2-h

    19. Dezember 2013 um 10:12 Uhr

  • @Farhad Hallo, ich verwende dieses Stück Code von dir, aber ich bin nur neugierig, ob eine switch-Anweisung nicht schneller wäre. Persönlich fühlt es sich einfach so an, als würde eine Switch-Anweisung besser passen. Aber danke, das hat mein Problem gelöst

    – Fernando Silva

    21. Juni 2014 um 16:46 Uhr

  • funktioniert nicht, das Skript zeigt Chrome zurück, wenn der Browser Opera ist.

    – Die EasyLearn-Akademie

    2. September 2017 um 5:58 Uhr

  • Um den Edge-Browser zu überprüfen, können Sie hinzufügen elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'Edge') !== FALSE) echo 'Microsoft Edge'; nach dem if

    – Mohammad Salehi

    1. Dezember 2018 um 15:53 ​​Uhr

  • Das funktioniert wirklich gut, ich habe keine Ahnung warum. Willst du es erklären?

    Benutzer11480180

    21. August 2019 um 9:12 Uhr

Mit einer bestehenden Methode (z get_browser) ist wahrscheinlich besser, als selbst etwas zu schreiben, da es (besser) unterstützt wird und mit neueren Versionen aktualisiert wird. Möglicherweise gibt es auch verwendbare Bibliotheken, um die Browser-ID auf zuverlässige Weise abzurufen.

Entschlüsselung der $_SERVER['HTTP_USER_AGENT'] ist schwierig, da viele Browser ziemlich ähnliche Daten haben und dazu neigen, sie für ihre eigenen Vorteile (missbrauchen) zu verwenden. Aber wenn Sie sie wirklich entschlüsseln möchten, können Sie die Informationen auf verwenden diese Seite für alle verfügbaren Agenten-IDs. Diese Seite zeigt auch, dass Ihre Beispielausgabe tatsächlich zu IE 7 gehört. Weitere Informationen zu den Feldern in der Agenten-ID selbst finden Sie unter diese Seiteaber wie ich bereits sagte, neigen Browser dazu, es für ihre eigenen Vorteile zu verwenden, und es könnte in einem (etwas) anderen Format vorliegen.

  • Diese Funktion funktioniert nicht auf jedem Server. Versuchte 3 Server – 0/3.

    – ViliusL

    18. Juni 2018 um 14:34 Uhr

  • Wie ViliusL sagt, funktioniert es nicht auf jedem Server, da der Pfad zu seiner INI-Datei in der php.ini oder der “http.config”-Datei auf Apache festgelegt werden muss. Das bedeutet, dass Sie Zugriff darauf haben müssen.

    – JSG

    16. Oktober 2019 um 19:50 Uhr


  • Übrigens, falls jemand es versucht hat, setzen Sie die Browscap-Direktive auf Skriptebene mit ini_set('browscap', '/path/to/browscap.ini'); scheint nicht zu funktionieren. Diese Direktive muss in einer PHP-Konfigurationsdatei festgelegt werden (wie im obigen Kommentar angegeben).

    – Leo Galleguillos

    26. Mai 2020 um 18:46 Uhr


zuverlassige Benutzer Browser Erkennung mit php
Jay

Der Benutzeragent kann gefälscht werden, und es ist besser, sich nicht auf die Zeichenfolge des Benutzeragenten zu verlassen, als dass Sie eine CSS3-Medienabfrage verwenden können, wenn Sie nur die Orientierung erkennen möchten (Sie können das CSS des berühmten responsiven Framework-Bootstrap untersuchen, um zu überprüfen, wie Sie damit umgehen können Orientierungsteil mit CSS)

Hier ist kleines 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 */
    }    

Weiterlesen : Über die CSS-Ausrichtungserkennung

ODER Sie können die Orientierung mit JavaScript finden:

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

Weiterlesen : Informationen zur Erkennung der Ausrichtung mit JS

Wenn Sie wirklich mit der Zeichenfolge des Benutzeragenten arbeiten möchten, wird Ihnen dieser Code sehr helfen und in fast jedem Browser gut funktionieren:

<?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("https://stackoverflow.com/".$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();

Der obige Code funktioniert für mich fast auf jedem Browser und ich hoffe, er wird Ihnen ein wenig helfen.

  • oh Junge, aber Sie wissen nicht einmal, was er mit diesen Informationen tun will, und schlagen Medienanfragen vor …

    – Benutzer151496

    23. Juni 2015 um 12:27 Uhr

  • Ein kleines Detail, in Edge erkennt es es als Chrome, um es zu beheben, fügen Sie einfach im _basic_browser-Array vor Chrome das ‘Edg’ => ‘Microsoft Edge’ hinzu,

    – ciberelfo

    25. Januar 2021 um 12:59 Uhr

1645911849 868 zuverlassige Benutzer Browser Erkennung mit php
Lebenslehrer

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(); 

Wenn stripos($_SERVER[‘HTTP_USER_AGENT’],”mozilla”)!==false)

Das ist kein sinnvoller Test, fast jeder Browser identifiziert sich als Mozilla.

ist $_SERVER[‘HTTP_USER_AGENT’] ein zuverlässiger Weg?

Nein.

Sollte ich mich stattdessen für die Funktion get_browser entscheiden?

Nein.

Browser-Sniffing auf der Serverseite ist ein verlorenes Spiel. Abgesehen von all den Problemen beim Versuch, die UA-Zeichenfolge zu analysieren, den Browsern, die lügen, den obskuren Browsern und der Möglichkeit, dass der Header überhaupt nicht vorhanden ist, müssen Sie den festlegen, wenn Sie einen anderen Seiteninhalt für einen anderen Browser zurückgeben Vary Kopfzeile einzufügen User-Agentandernfalls können Caching-Proxys die falsche Version der Seite an den falschen Browser zurückgeben.

Aber wenn Sie hinzufügen Vary: User-Agent Der defekte Caching-Code des IE wird verwirrt und lädt die Seite jedes Mal neu. Du kannst also nicht gewinnen.

Wenn Sie Browser-Sniffs durchführen müssen, können Sie dies auf der Clientseite tun, indem Sie JavaScript und speziell im Fall von IE bedingte Kommentare verwenden. Es ist ein Glück, dass IE bedingte Kommentare unterstützt, da dies der einzige Browser ist, für den Sie häufig Problemumgehungen benötigen. (Siehe die Antwort von scunliffe für die gängigste Strategie.)

1645911849 498 zuverlassige Benutzer Browser Erkennung mit php
Gemeinschaft

Bei Google taucht immer noch ein alter Beitrag auf. get_browser() ist die beste Lösung, aber das Bearbeiten von php.ini könnte unmöglich sein. Laut diesem Beitrag können Sie die Eigenschaft browscap nicht ini_set setzen. Was bleibt also? phpbrowscap scheint die Arbeit zu erledigen. Die Dokumente sind nicht großartig. Wenn Sie also nicht möchten, dass sie automatisch aktualisiert werden (standardmäßig aktiviert), müssen Sie dies festlegen

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL;
$bc->localFile = __DIR__ . "/php_browscap.ini";

Was mir auffällt, der echte Browsername kommt immer nach dem letzten (parentheses) mit Ausnahme von IE, wo kein Browsername nach dem letzten steht (parentheses). Ich frage mich, ob ich nur nach dem letzten lese ) Genauigkeit verbessern könnte.

Sie können dies in verschiedenen Benutzeragenten bemerken:

Google Chrome

Safari

Feuerfuchs

Rand

IE (die Ausnahme, wo kein Browser nach Klammern definiert ist)

Beispiel:

$userBrowser = (!empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT'));
$userBrowser = explode(')', $userBrowser);
$userBrowser = $userBrowser[count($userBrowser)-1];

echo $userBrowser; //this has many inaccurate browsers stripped out

Eine volle Funktion:

function getUserBrowser(){
  $fullUserBrowser = (!empty($_SERVER['HTTP_USER_AGENT'])? 
  $_SERVER['HTTP_USER_AGENT']:getenv('HTTP_USER_AGENT'));
  $userBrowser = explode(')', $fullUserBrowser);
  $userBrowser = $userBrowser[count($userBrowser)-1];

  if((!$userBrowser || $userBrowser === '' || $userBrowser === ' ' || strpos($userBrowser, 'like Gecko') === 1) && strpos($fullUserBrowser, 'Windows') !== false){
    return 'Internet-Explorer';
  }else if((strpos($userBrowser, 'Edge/') !== false || strpos($userBrowser, 'Edg/') !== false) && strpos($fullUserBrowser, 'Windows') !== false){
    return 'Microsoft-Edge';
  }else if(strpos($userBrowser, 'Chrome/') === 1 || strpos($userBrowser, 'CriOS/') === 1){
    return 'Google-Chrome';
  }else if(strpos($userBrowser, 'Firefox/') !== false || strpos($userBrowser, 'FxiOS/') !== false){
    return 'Mozilla-Firefox';
  }else if(strpos($userBrowser, 'Safari/') !== false && strpos($fullUserBrowser, 'Mac') !== false){
    return 'Safari';
  }else if(strpos($userBrowser, 'OPR/') !== false && strpos($fullUserBrowser, 'Opera Mini') !== false){
    return 'Opera-Mini';
  }else if(strpos($userBrowser, 'OPR/') !== false){
    return 'Opera';
  }
  return false;
}

echo 'browser detect: '.getUserBrowser();

Ich habe dies auch auf Chrome, Edge und Firefox Developer getestet und es hat genau funktioniert. (obwohl ich ältere Versionen dieser Browser noch nicht getestet habe)

  • Es zeigt “Safari” sowohl auf meinem Desktop-Chrome->Inspektionsmodus als auch auf meinem mobilen Safari

    – Benutzer3495363

    23. Juni 2021 um 4:38 Uhr


868530cookie-checkzuverlässige Benutzer-Browser-Erkennung mit php

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy