浏览器详细信息检测的最佳实践——我应该在客户端(使用 JavaScript)还是服务器端(使用 PHP 和 WURFL)进行检测

Best practice for browser details detection - Should I do it in client side (Using JavaScript) or server side (Using PHP and WURFL)

到目前为止,我正在客户端使用 JavaScript 进行浏览器详细信息检测。

data['browserDetails'] = {
    'browser'       : getBrowser(),
    'majorVersion'  : getBrowserMajorVersion(),
    'appCodeName'   : navigator.appCodeName,
    'appName'       : navigator.appName,
    'appVersion'    : navigator.appVersion,
    'language'      : navigator.language,
    'platform'      : navigator.platform,
    'cookieEnabled' : navigator.cookieEnabled,
};

// 
function getBrowser()
{
    var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    if (isOpera) {
        return 'Opera';
    }

    var isFirefox = typeof InstallTrigger !== 'undefined';
    if (isFirefox) {
        return 'Firefox';
    }

    var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);
    if (isSafari) {
        return 'Safari';
    }

    var isIE = /*@cc_on!@*/false || !!document.documentMode;
    if (isIE) {
        return 'IE';
    }

    var isEdge = !isIE && !!window.StyleMedia;
    if (isEdge) {
        return 'Edge';
    }

    var isChrome = !!window.chrome && !!window.chrome.webstore;
    if (isChrome) {
        return 'Chrome';
    }

    return 'Unknown';
}

// 
function getBrowserMajorVersion()
{
    var ua= navigator.userAgent, tem,
            M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

    if (/trident/i.test(M[1])) {
        tem=  /\brv[ :]+(\d+)/g.exec(ua) || [];
        return (tem[1] || '');
    }

    if (M[1]=== 'Chrome') {
        tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
        if (tem!= null) return tem[2];
    }

    M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if ((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
    return M[1];
}

我曾经尝试通过使用 PHP + WURFL 来使用服务器端代码执行浏览器详细信息检测。对于我非常有限的测试用例,它并没有显示服务器端检测比客户端检测更好(准确度)。

我想知道,浏览器详细信息检测的最佳做法是什么?就准确性而言,我应该在客户端(使用 JavaScript)还是服务器端(使用 PHP 和 WURFL)进行?

谢谢。

我通常在服务器端检测浏览器。

我检测浏览器以更改 html 我在应用程序加载前呈现的内容的原因。这就是为什么服务器端检测最适合我的用例。

我用的这个php这个我很久以前捡到的功能

<?php
/* USER-AGENTS  This is my custom function to add contact logic...
================================================== */
function check_user_agent ( $type = NULL ) {
    $user_agent = strtolower ( $_SERVER['HTTP_USER_AGENT'] );
    if ( $type == 'bot' ) {
            // matches popular bots
            if ( preg_match (     "/googlebot|adsbot|yahooseeker|yahoobot|msnbot|watchmouse|pingdom\.com|feedfetcher-google/", $user_agent ) ) {
                    return true;
                    // watchmouse|pingdom\.com are "uptime services"
            }
    } else if ( $type == 'browser' ) {
            // matches core browser types
            if ( preg_match ( "/mozilla\/|opera\//", $user_agent ) ) {
                    return true;
            }
    } else if ( $type == 'mobile' ) {
            // matches popular mobile devices that have small screens and/or touch inputs
            // mobile devices have regional trends; some of these will have varying popularity in Europe, Asia, and America
            // detailed demographics are unknown, and South America, the Pacific Islands, and Africa trends might not be represented, here
            if ( preg_match ( "/phone|iphone|itouch|ipod|symbian|android|htc_|htc-|palmos|blackberry|opera mini|iemobile|windows ce|nokia|fennec|hiptop|kindle|mot |mot-|webos\/|samsung|sonyericsson|^sie-|nintendo/", $user_agent ) ) {
                    // these are the most common
                    return true;
            } else if ( preg_match ( "/mobile|pda;|avantgo|eudoraweb|minimo|netfront|brew|teleca|lg;|lge |wap;| wap /", $user_agent ) ) {
                    // these are less common, and might not be worth checking
                    return true;
            }
    }
    return false;
} ?>

然后我创建一个类似于此的函数调用

<?php $mobilehtml="<a href=''></a>";

$ismobile = check_user_agent('mobile');
if($ismobile) {
    echo "$mobilehtml";
} 
else {

    echo "$browserhtml";
}
?>

希望对您有所帮助。

  1. user-agent 可以通过代理修改或删除(或一些复杂的 firewall-proxy 组合)。
  2. javascript 从您的服务器获取负载。

所以最好使用 javascript 在客户端检查。