浏览器详细信息检测的最佳实践——我应该在客户端(使用 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";
}
?>
希望对您有所帮助。
user-agent
可以通过代理修改或删除(或一些复杂的 firewall-proxy 组合)。
- javascript 从您的服务器获取负载。
所以最好使用 javascript 在客户端检查。
到目前为止,我正在客户端使用 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";
}
?>
希望对您有所帮助。
user-agent
可以通过代理修改或删除(或一些复杂的 firewall-proxy 组合)。- javascript 从您的服务器获取负载。
所以最好使用 javascript 在客户端检查。