22

我很想知道用户代理在服务器端是否是使用 PHP 的“Chrome”。是否有可靠的正则表达式用于从请求标头中解析出用户代理字符串?

4

4 回答 4

31

在这一点上,太多的浏览器冒充 Chrome 以利用其受欢迎程度以及打击滥用浏览器检测以使“Chrome”的简单匹配不再有效。我建议继续进行特征检测,但 Chrome(以及一般的 WebKit/Blink)也因对特征检测机制撒谎而臭名昭著,因此即使这样也没有像人们所说的那么好。

我只能建议通过第三方站点将其已知的 UA 字符串与其他浏览器的字符串进行比较,并从那里创建模式,从而掌握最新情况。你如何做到这一点完全取决于字符串本身。请记住,由于浏览器的性质和 UA 字符串,永远不可能有一个“可靠的”正则表达式来匹配它们。

在 PHP 中,相关的服务器变量是$_SERVER['HTTP_USER_AGENT'].

于 2010-06-15T18:23:58.200 回答
20

值得一提的是,如果您还想包含适用于 iOS 的 Chrome,您还需要匹配“CriOS”:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false
 || strpos($_SERVER['HTTP_USER_AGENT'], 'CriOS') !== false) {
    // User agent is Google Chrome
}
于 2013-06-03T10:13:02.097 回答
9

基于@Adams 答案,通过使用 useragentstring.comudger.com在用户代理字符串中排除一些带有“Chrome”的浏览器,更准确地检测 Google Chrome :

if(preg_match('/(Chrome|CriOS)\//i',$_SERVER['HTTP_USER_AGENT'])
 && !preg_match('/(Aviator|ChromePlus|coc_|Dragon|Edge|Flock|Iron|Kinza|Maxthon|MxNitro|Nichrome|OPR|Perk|Rockmelt|Seznam|Sleipnir|Spark|UBrowser|Vivaldi|WebExplorer|YaBrowser)/i',$_SERVER['HTTP_USER_AGENT'])){
    // Browser might be Google Chrome
}
于 2015-11-15T12:37:36.690 回答
1

实际上有一些方法可以检测浏览器。但是,正如其中一个答案所述,浏览器、索引机器人广泛模仿其真实姓名,因此,一旦成功,手动功能可能随时停止正常工作。

如果您使用特定浏览器打印某些内容,其中 CSS 媒体规则在我回答之日的跨浏览器兼容性方面实施不佳,有时需要进行浏览器检测。

简单不可靠的方法

只是为了通过 UA 字符串获取特定的浏览器,您可以使用这样的函数(从这里修改的 fork ):

function get_browser_manually() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $browser = "n/a";
    $browsers = array(
        '/msie/i' => 'Internet explorer',
        '/IE/i' => 'Internet explorer',
        '/Edg/i' => 'Edge',
        '/gecko/i' => 'Firefox',
        '/fox/i' => 'Firefox',
        '/safari/i' => 'Safari',
        '/opera/i' => 'Opera',
        '/mobile/i' => 'Mobile browser',
        '/phone/i' => 'Mobile browser',
        '/Yowser/i' => 'Yandex Browser',
        '/Ya/i' => 'Yandex Browser',
        '/Presto/i' => 'Opera',
        '/Chrome/i' => 'Chrome'
    );

    foreach ($browsers as $regex => $value) {
    if (preg_match($regex, $user_agent)) { 
        $browser = $value; 
        return $browser;
    }
    }
}

echo "Browser: " . get_browser_manually();

内置和可靠的方式

PHP 内置了get_browser()函数来获取浏览器和平台。在 PHP7 之前它很慢,但据报道现在它变得更快了。

为了使这个东西正常工作,您需要从browscap.org下载额外的文件(小、中、大取决于您的检测精度需要) ,将文件复制到 PHP 目录并将其包含在php.ini中:

[browscap]
; http://php.net/browscap
browscap = C:\PHP\extras\lite_php_browscap.ini

在 PHP 脚本中,您可以调用 get_browser() 并使用输出:

$browser = get_browser(null, true);
echo '<pre>';
echo print_r($browser,1);
echo '</pre>';

Chrome 的输出将是这样的:

Array
(
    [browser_name_regex] => ~^mozilla/5\.0 \(.*windows nt 10\.0.*\) applewebkit ... ...
    [browser_name_pattern] => Mozilla/5.0 (*Windows NT 10.0*) applewebkit... ...
    [parent] => Chrome 89.0
    [platform] => Win10
    [comment] => Chrome 89.0
    [browser] => Chrome
    [version] => 89.0
    [device_type] => Desktop
    [ismobiledevice] => 
    [istablet] => 
)

如果您需要测试其他浏览器,请考虑 Chrome 的轻量级Useragent 切换器扩展

注意: browsecap 文件不是默认配置,默认禁用。通过检查是否可以调用get_browser()确保您安全地调用它:

if (!ini_get('browscap')) {

    // Not set, use other custom func to detect browser:
    $browser = get_browser_manually();
} else {

    // Browsecap.ini was set, use it:
    $browser = get_browser(null, true);
}
于 2021-09-05T16:31:27.720 回答