尝试用PHP检测用户的浏览器,$ _SERVER ['HTTP_USER_AGENT']是一种可靠的方法吗?我应该选择get_browser功能吗?您找到哪一个会带来更精确的结果?
如果这种方法实用,建议用它来输出相关的CSS链接,例如:
if(stripos($_SERVER['HTTP_USER_AGENT'],"mozilla")!==false)
echo '<link type="text/css" href="mozilla.css" />';
我注意到this question,但是我想澄清这是否适合面向CSS的检测。
更新
真的很可疑:我在IE 7上尝试了echo $_SERVER['HTTP_USER_AGENT'];
,这就是它的输出:
Mozilla / 4.0(兼容; 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也给了“mozilla”一些奇怪的东西。是什么给了什么?
答案 0 :(得分:58)
检查此代码,我发现这很有用。不要检查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';
答案 1 :(得分:16)
使用现有方法(即get_browser
)可能比自己写一些东西更好,因为它有(更好)的支持,并将使用更新的版本进行更新。可能还有可用的库可以以可靠的方式获取浏览器ID。
解码$_SERVER['HTTP_USER_AGENT']
很困难,因为很多浏览器都有非常相似的数据,并倾向于(错误地)使用它来获得自己的好处。但是如果你真的想要解码它们,你可以使用this page上的信息来获取所有可用的代理ID。
此页面还显示您的示例输出确实属于IE 7.有关代理ID本身中字段的更多信息可以在this page上找到,但正如我所说,浏览器倾向于使用它来获取它们自己的好处而且它可能是(稍微)其他格式。
答案 2 :(得分: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();
答案 3 :(得分:3)
如果stripos($ _ SERVER ['HTTP_USER_AGENT'],“mozilla”)!== false)
这不是一个有用的测试,几乎每个浏览器都将自己标识为Mozilla。
是$ _SERVER ['HTTP_USER_AGENT']一种可靠的方法吗?
没有
我应该选择get_browser函数吗?
没有
在服务器端浏览器嗅探是一场失败的游戏。除了尝试解析UA字符串,浏览器,浏览器以及标题根本不存在的可能性之外的所有问题,如果为不同的浏览器返回不同的页面内容,则必须设置{{ 1}}标头包含Vary
,否则缓存代理可能会将错误版本的页面返回错误的浏览器。
但是如果添加User-Agent
IE的破解缓存代码会混淆并且每次都重新加载页面。所以你不能赢。
如果你必须浏览器嗅探,那么这个地方就是在客户端,使用JavaScript,特别是在IE的情况下,是条件注释。幸运的是,IE支持条件评论,因为这是您经常需要解决方法的浏览器。 (参见scunliffe对最常见策略的回答。)
答案 4 :(得分:2)
老帖子仍然出现在Google上。 get_browser()是最好的解决方案,但编辑php.ini可能是不可能的。根据{{3}},您无法设置browscap属性。那剩下什么了? this post似乎完成了工作。文档不是很好,所以如果你不想让它自动更新(默认打开),那么你需要设置
$bc->updateMethod = phpbrowscap\Browscap::UPDATE_LOCAL;
$bc->localFile = __DIR__ . "/php_browscap.ini";
答案 5 :(得分:2)
用户代理可以伪造,最好不依赖于用户代理字符串而不是你可以使用CSS3媒体查询,如果你只想检测方向(你可以探索着名的响应式框架bootstrap的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 */
}
了解详情:About CSS orientation detection
或者您可以使用JavaScript找到方向:
// Listen for orientation changes
window.addEventListener("orientationchange", function() {
// Announce the new orientation number
alert(window.orientation);
}, false);
了解详情:About detect orientation using 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();
上面的代码几乎适用于每个浏览器,我希望它会对你有所帮助。
答案 6 :(得分:2)
我注意到,实际的浏览器名称总是在最后一个(parentheses)
之后,而IE除外,在IE之外,没有浏览器名称。我想知道仅在最后一个(parentheses)
之后阅读才能提高准确性。
您可能会在其他用户代理中注意到这一点:
IE(括号后未定义浏览器的例外)
示例:
)
完整功能:
$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
我也在chrome,edge和firefox开发人员上对此进行了测试,并且可以正常工作。 (尽管我尚未测试这些浏览器的旧版本)
答案 7 :(得分:1)
我认为依赖于userAgent有点弱,因为它可能(并且经常)伪造。
如果您只想为IE提供CSS,请使用条件注释。
<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测试与当前浏览器匹配。
答案 8 :(得分: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>";
?>
答案 9 :(得分:0)
首先,我将从Edge开始,因为Internet Explorer在其任何UA中都不包含术语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浏览器,以便后续查询不会干扰这一点。除了Opera Mini之外,所有iOS浏览器都使用webkit,它从远程服务器而不是设备进行渲染。这意味着我们可以使用iOS
定位UA中的操作系统,并排除包含Opera
的UA。
} 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在其UA中包含Gecko
,因为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
引擎到v12结尾。从v15开始,他们开始使用像Chrome这样的Blink引擎。 v12和更早版本在UA中包含两个v15 +没有的唯一单词 - Opera
和Presto
。您可以将它们中的任何一个定位,因为它们始终在一起。对于第15版,Opera开始在UA中使用OPR
。
} 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。 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直到v27。随着v28发布,他们切换到Blink引擎。我们可以针对两个引擎,但需要大量代码。由于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文件。随意根据需要调整它,让它做你需要它做的事情。我希望这会有所帮助。
答案 10 :(得分:0)
我找到的大多数PHP软件包似乎都不错,但是我找不到一个可以满足我需要的所有东西,因此我构建了一个Laravel助手来组合其中的三个。
以下是软件包:
jenssegers / agent
whichbrowser / parser
cbschuld / browser.php
这是我的功能:
function browser($userAgent)
{
$agent = new \Jenssegers\Agent\Agent();
$agent->setUserAgent($userAgent);
$result = new \WhichBrowser\Parser($userAgent);
$browser = new \Browser($userAgent);
return new class($agent, $result, $browser)
{
public function __construct($agent, $result, $browser)
{
$this->agent = $agent;
$this->result = $result;
$this->browser = $browser;
}
public function device()
{
return $this->agent->device() ?: $this->result->device->toString() ?: $this->browser->getPlatform();
}
public function browser()
{
return $this->agent->browser() ?: $this->result->browser->name ?: $this->browser->getBrowser();
}
public function platform()
{
return $this->agent->platform() ?: $this->result->os->name ?: $this->browser->getPlatform();
}
public function isMobile()
{
return $this->agent->isPhone() ?: $this->result->isType('mobile') ?: $this->browser->isMobile();
}
public function isTablet()
{
return $this->result->isType('tablet') ?: $this->browser->isTablet();
}
public function isDesktop()
{
return $this->agent->isDesktop() ?: $this->result->isType('desktop') ?: (! $this->browser->isMobile() && ! $this->browser->isTablet());
}
public function isRobot()
{
return $this->agent->isRobot() ?: $this->browser->isRobot();
}
};
这里是使用方法:
$browser = browser($userAgent);
$browser->device();
$browser->platform();
$browser->browser();
$browser->isMobile();
$browser->isTablet();
$browser->isDesktop();
$browser->isRobot();