2010-02-13 18 views
27

Intentando detectar el navegador de un usuario con PHP solamente, ¿es $ _SERVER ['HTTP_USER_AGENT'] una manera confiable? ¿Debería optar por la función get_browser? ¿cuál encuentras trae resultados más precisos?detección confiable del navegador del usuario con php

Si este método es pragmático, es que poco aconsejable utilizarla para dar salida a los enlaces de CSS pertinentes, por ejemplo:

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

Noté this question, sin embargo quería aclarar si esto es bueno para orientarse CSS detección.

ACTUALIZACIÓN: algo realmente sospechoso: Probé echo $_SERVER['HTTP_USER_AGENT']; en IE 7 y esto es lo que la salida:

Mozilla/4.0 (compatible; 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 dio algo raro con "Mozilla" en ella también. ¿Lo que da?

+0

El bit "Mozilla/4.0" está ahí por razones heredadas ... incluso en IE8. – scunliffe

+0

IE se identifica desde hace algún tiempo como Mozilla 4.0. He leído que lo hicieron por razones de compatibilidad, pero no puedo encontrar la fuente en este momento.Si tuviera que adivinar, diría que esto es una ruina del tiempo de NetScape/IE. – Bobby

+0

* User-Agent * no es confiable. Pero es la única manera de adivinar. – Gumbo

Respuesta

15

Usar un método existente (es decir, get_browser) es probablemente mejor que escribir algo usted mismo, ya que tiene (mejor) soporte y se actualizará con las versiones más recientes. También puede haber bibliotecas utilizables para obtener la identificación del navegador de manera confiable.

La decodificación del $_SERVER['HTTP_USER_AGENT'] es difícil, ya que muchos navegadores tienen datos bastante similares y tienden a (mal) usarlo para sus propios beneficios. Pero si realmente desea decodificarlos, puede usar la información en this page para todos los identificadores de agente disponibles. Esta página también muestra que el resultado de su ejemplo pertenece a IE 7. Se puede encontrar más información sobre los campos en el ID del agente en this page, pero como ya he dicho, los navegadores tienden a usarlo para sus propios beneficios y podría estar en un (ligeramente) otro formato.

0

Creo que confiar en el userAgent es un poco débil ya que puede (y suele) ser falso.

Si desea publicar CSS solo para IE, use un comentario condicional.

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

o si sólo quiere uno para IE6:

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

Desde su un comentario a su ignorado por los navegadores IE ... excepto que lo carga si la prueba de si coincide con el navegador actual.

+0

Si es falso, ¿a quién le importa? No es que dependas de la seguridad, solo se trata de mostrar algo al usuario ... –

2

si stripos ($ _ SERVER [ 'HTTP_USER_AGENT'], "Mozilla")! == false)

eso no es una prueba útil, casi todos los navegadores se identifica como Mozilla.

es $ _SERVER ['HTTP_USER_AGENT'] una manera confiable?

No.

¿Debería optar por la función get_browser?

navegador detectores en el lado del servidor es un juego perdido. Además de todos los problemas de intentar analizar la cadena UA, los navegadores que mienten, los navegadores oscuros y la posibilidad de que el encabezado no esté allí, si devuelve contenido de página diferente para un navegador diferente debe configurar el encabezado Vary para incluir User-Agent, de lo contrario los proxies de caché pueden devolver la versión incorrecta de la página al navegador incorrecto.

Pero si agrega Vary: User-Agent el código de caché roto de IE se confunde y vuelve a cargar la página cada vez. Entonces no puedes ganar

Si debe explorar-oler, el lugar para hacerlo está en el lado del cliente, usando JavaScript y, específicamente en el caso de IE, los comentarios condicionales. Es una suerte que IE sea compatible con los comentarios condicionales, ya que es el único navegador para el que a menudo se necesitan soluciones alternativas. (Consulte la respuesta de scunliffe para la estrategia más común.)

6
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(); 
+4

Dice que Chrome es safari ... –

+0

¿Por qué estás creando una clase con solo un método? ¿por qué no usar una función normal en su lugar? –

+0

Esa es tu elección hacer lo que quieras. Estoy dando un ejemplo de cómo detectar el navegador. Lo he tomado de uno de mis proyectos de trabajo. También usar objetos es más preferible para todos los desarrolladores. – user1524615

53

Compruebe este código, he encontrado que esto es útil. No marque Mozilla porque la mayoría el uso del navegador esto como cadena de agente de usuario

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

Awesome +1 esto! –

+4

No funciona para IE 11 (échele un vistazo aquí: http://www.nczonline.net/blog/2013/07/02/internet-explorer-11-dont-call-me-ie/) –

+2

editado @rap -2-h –

1

Viejo poste todavía aparece en Google. get_browser() es la mejor solución, pero la edición de php.ini podría ser imposible. De acuerdo con this post no se puede iniciar la propiedad browscap. Entonces, ¿qué queda? phpbrowscap parece hacer el trabajo. Los documentos no son grandes por lo que si usted no quiere que la actualización automática (por defecto está activado), entonces es necesario establecer

$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL; 
$bc->localFile = __DIR__ . "/php_browscap.ini"; 
0
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>"; 

?> 
2

agente de usuario puede ser falsificada y su mejor no Depende de la cadena de agente de usuario en lugar de utilizar las consultas de medios CSS3 si solo desea detectar la orientación (puede explorar el CSS de la famosa herramienta de arranque de esquema sensible para verificar cómo puede manejar la parte de orientación utilizando CSS)

Aquí es poco 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 */ 
    }  

Leer más: About CSS orientation detection

o usted puede encontrar la orientación uso de JavaScript:

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

Leer más: About detect orientation using JS

Por último, si realmente quiere ir con cadena de agente de usuario a continuación, este código se ayuda mucho, funciona bien casi en todos los navegadores:

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

El código anterior funciona s para mí casi en todos los navegadores y espero que te ayude un poco.

+1

oh chico, pero ni siquiera sabes lo que quiere hacer con esa información y vas sugiriendo consultas en los medios ... – user151496

Cuestiones relacionadas