not navegador php browser-detection

not - detección confiable del navegador del usuario con php



php detect (9)

¿Intenta 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?

Si este método es pragmático, ¿no es aconsejable utilizarlo para generar enlaces CSS pertinentes, por ejemplo:

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

Me di cuenta de esta pregunta , sin embargo, quería aclarar si esto es bueno para la detección orientada a CSS.

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

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 también dio algo raro con "mozilla". ¿Lo que da?


si stripos ($ _ SERVER [''HTTP_USER_AGENT''], "mozilla")! == falso)

No es una prueba útil, casi todos los navegadores se identifican a sí mismos como Mozilla.

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

No.

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

No.

El rastreo del navegador 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 de Vary: User-Agent se confunde y vuelve a cargar la página cada vez. Entonces no puedes ganar

Si debe explorar el navegador, el lugar para hacerlo está en el lado del cliente, usando JavaScript y, específicamente en el caso de IE, 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. (Ver la respuesta de scunliffe para la estrategia más común).


@Ekramul Hoque estaba en el camino correcto, pero hay varios defectos en su respuesta.

Antes que nada, comenzaría con Edge ya que Internet Explorer no contiene el término Edge en ninguno de sus UA.

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

Luego, continúe trabajando hacia atrás ya que las versiones anteriores de IE no usaban el motor Trident y, por lo tanto, no lo incluirían en su 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" />'';

Necesitamos dirigir navegadores iOS a continuación para que las consultas posteriores no interfieran con este. Todos los navegadores iOS usan webkit con la excepción de Opera Mini, que hace su renderizado desde un servidor remoto en lugar del dispositivo. Esto significa que podemos dirigir el sistema operativo en el UA con iOS y excluir los UA que contienen Opera .

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

Luego, avance a los navegadores Firefox. Si bien Firefox utiliza el término de búsqueda, solo identificará los navegadores Firefox, no los navegadores basados ​​en Firefox. Firefox contiene Gecko en su UA ya que Gecko es el motor que usa, y por lo tanto, podemos atacarlo. Al usar Gecko , podemos identificar todos los navegadores que se ejecutan en el motor Gecko (es decir, SeaMonkey). Sin embargo, muchos navegadores usan el término like Gecko por razones de compatibilidad, por lo que debemos asegurarnos de que coincida con Gecko y no con 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" />'';

Avanzando, identificaremos los navegadores Opera. Opera usó el motor Presto hasta el final de v12. Comenzando con v15, comenzaron a usar el motor Blink como Chrome. v12 y anteriores contenían dos palabras únicas en el UA que v15 + no tiene-- Opera y Presto . Puede apuntar a cualquiera de ellos ya que siempre estuvieron presentes juntos. Para v15, Opera comenzó a usar OPR en la 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" />'';

El siguiente es Safari. Safari usa AppleWebKit como motor de renderizado, pero no podemos solo apuntar a eso porque Chrome también incluye AppleWebKit y Safari en su UA por razones de compatibilidad. Por lo tanto, debemos buscar AppleWebKit y no Chrome .

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

Finalmente, llegamos a Chrome. Chrome usó AppleWebKit hasta v27. Con la versión v28, cambiaron al motor Blink. Podríamos apuntar a ambos motores pero requeriría mucho código. Siendo que Chrome ahora es casi a v70, solo buscaremos Chrome ya que es muy poco probable que alguien todavía esté ejecutando una versión de Chrome Webkit.

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

Y por último, pero no por eso menos importante, su alternativa / de lo contrario.

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

Ahora, utilicé los archivos css que hacen referencia al prefijo del proveedor para apuntar aquí. Siéntase libre de modificar esto según sea necesario para que haga lo que necesita hacer. Espero que esto haya ayudado.


Creo que confiar en el userAgent es un poco débil ya que puede (y es) a menudo falsificado.

Si desea servir 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 solo quieres uno para IE6:

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

Dado que es un comentario ignorado por los navegadores ... excepto IE que lo carga si la prueba if coincide con el navegador actual.


El agente de usuario puede ser falsificado y es mejor no depender de la cadena de agente de usuario en lugar de utilizar las consultas de medios de CSS3 si solo desea detectar la orientación (puede explorar el CSS de la famosa herramienta de arranque del marco sensible para verificar cómo puede manejar el parte de orientación usando CSS)

Aquí hay un poco de 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: Acerca de la detección de orientación CSS

O puede encontrar la orientación usando JavaScript:

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

Leer más: Acerca de detectar orientación usando JS

Finalmente, si realmente quiere ir con la cadena de agente de usuario, este código le ayudará mucho, funcionará 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 para mí casi en todos los navegadores y espero que te ayude un poco.


La publicación antigua aún aparece en Google. get_browser () es la mejor solución, pero la edición de php.ini podría ser imposible. De acuerdo con esta publicación, no puedes iniciar la propiedad de la cabecera. Entonces, ¿qué queda? phpbrowscap parece hacer el trabajo. Los documentos no son geniales, por lo que si no desea que se actualice automáticamente (el valor predeterminado es activado), entonces debe configurar

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


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 de $_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 esta página 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 la propia identificación del agente en esta página , pero como ya he dicho, los navegadores tienden a usarlo para sus propios beneficios y podría estar en un (ligeramente) otro formato.


Verifique este código, he encontrado que esto es útil. No revises Mozilla porque la mayoría de los navegadores lo usan como una 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'';


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>"; ?>


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