服务器端浏览器检测?的node.js

时间:2011-05-28 17:47:06

标签: javascript browser node.js browser-detection

我见过的大多数实现都是在客户端进行浏览器检测。我只是想知道在向客户端发送任何资源之前是否可以进行浏览器检测。

感谢。

15 个答案:

答案 0 :(得分:79)

var ua = request.headers['user-agent'],
    $ = {};

if (/mobile/i.test(ua))
    $.Mobile = true;

if (/like Mac OS X/.test(ua)) {
    $.iOS = /CPU( iPhone)? OS ([0-9\._]+) like Mac OS X/.exec(ua)[2].replace(/_/g, '.');
    $.iPhone = /iPhone/.test(ua);
    $.iPad = /iPad/.test(ua);
}

if (/Android/.test(ua))
    $.Android = /Android ([0-9\.]+)[\);]/.exec(ua)[1];

if (/webOS\//.test(ua))
    $.webOS = /webOS\/([0-9\.]+)[\);]/.exec(ua)[1];

if (/(Intel|PPC) Mac OS X/.test(ua))
    $.Mac = /(Intel|PPC) Mac OS X ?([0-9\._]*)[\)\;]/.exec(ua)[2].replace(/_/g, '.') || true;

if (/Windows NT/.test(ua))
    $.Windows = /Windows NT ([0-9\._]+)[\);]/.exec(ua)[1];

这对你有用。把它放在你的响应处理程序中。

答案 1 :(得分:28)

节点(npm install ua-parser)的ua-parser库为浏览器用户代理字符串公开了一大组正则表达式。我强烈推荐它以满足您的需求。

答案 2 :(得分:13)

我使用ua-parser-js将它们放在一起。我确信它可以改进,但它有用。

安装包:

sudo npm install ua-parser-js

在您的路线文件中需要UAParser:

var UAParser = require('ua-parser-js');

用它做一些事情:

function ensureLatestBrowser(req, res, next) {
  var parser = new UAParser();
  var ua = req.headers['user-agent'];
  var browserName = parser.setUA(ua).getBrowser().name;
  var fullBrowserVersion = parser.setUA(ua).getBrowser().version;
  var browserVersion = fullBrowserVersion.split(".",1).toString();
  var browserVersionNumber = Number(browserVersion);

  if (browserName == 'IE' && browserVersion <= 9)
    res.redirect('/update/');
  else if (browserName == 'Firefox' && browserVersion <= 24)
    res.redirect('/update/');
  else if (browserName == 'Chrome' && browserVersion <= 29)
    res.redirect('/update/');
  else if (browserName == 'Canary' && browserVersion <= 32)
    res.redirect('/update/');
  else if (browserName == 'Safari' && browserVersion <= 5)
    res.redirect('/update/');
  else if (browserName == 'Opera' && browserVersion <= 16)
    res.redirect('/update/');
  else
    return next();
}

然后在你的路线中致电:

app.all(/^(?!(\/update)).*$/, ensureLatestBrowser);

如果您想查看UAParser可以获得的其他信息,请查看他们的demo page.

答案 3 :(得分:4)

我想对我的网站的移动版本进行简单的重定向,因此用户代理足够可靠。我想在服务器端做这个,所以我没有浪费时间在客户端上加载不必要的css和js。 http://detectmobilebrowsers.com/具有最强大的正则表达式匹配。因此,我将一些快速中间件放在一起,只需在应用程序中添加两行代码即可进行重定向。

npm install detectmobilebrowsers安装

express = require 'express'
mobile  = require 'detectmobilebrowsers'

app = express()
app.configure () ->
  app.use mobile.redirect 'http://m.domain.com'
app.get '/', (req, res) ->
  res.send 'Not on Mobile'
app.listen 3000

答案 4 :(得分:4)

ua = request.headers['user-agent'];
if( /firefox/i.test(ua) )
  browser = 'firefox';
else if( /chrome/i.test(ua) )
  browser = 'chrome';
else if( /safari/i.test(ua) )
  browser = 'safari';
else if( /msie/i.test(ua) )
  browser = 'msie';
else
  browser = 'unknown';

答案 5 :(得分:2)

如果您使用快递,您可以使用以下内容轻松检查ua:

app.get('/ua', function(req, res){
    res.send('user ' + req.headers['user-agent']);
});

答案 6 :(得分:1)

大多数浏览器都提供名为“User-Agent”的HTTP请求标头,这与客户端的navigator.userAgent属性相同。

答案 7 :(得分:1)

答案 8 :(得分:1)

答案 9 :(得分:1)

几个月前,我最近发布了device-detector-js

它是Matomo设备检测器的TypeScript端口,这是一个功能强大的设备检测库,最初是用PHP编写的。

它可以解析任何用户代理,并检测浏览器,操作系统,使用的设备(台式机,平板电脑,移动设备,电视,汽车,控制台等),品牌和型号。

它经过了严格的测试,并依靠6000多个测试来检测成千上万种不同的设备。

安装

npm install device-detector-js

示例-简单的用户代理检测:

const DeviceDetector = require("device-detector-js");

const deviceDetector = new DeviceDetector();
const userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36";
const device = deviceDetector.parse(userAgent);

console.log(device);

看看full API documentation

答案 10 :(得分:0)

如果你想控制模板层中的移动设备,我只是为此编写了一个模块。 https://github.com/Fresheyeball/isMobile-node

答案 11 :(得分:0)

我改进了一些@ duck5auce的代码实际上很有用并且支持IE 10-12(Edge)。

var getDevice = function(ua) {
    var $ = {active: false, subactive: false};

    if (/mobile/i.test(ua)) {
        $.active = 'mobile';
        $.Mobile = true;
    }

    if (/like Mac OS X/.test(ua)) {
        $.active = 'iOS';
        $.iOS = /CPU( iPhone)? OS ([0-9\._]+) like Mac OS X/.exec(ua)[2].replace(/_/g, '.');
        if (/like Mac OS X/.test(ua)) {
            $.subactive = 'iPhone';
            $.iPhone = /iPhone/.test(ua);
        }
        if (/like Mac OS X/.test(ua)) {
            $.subactive = 'iPad';
            $.iPad = /iPad/.test(ua);
        }
    }

    if (/Android/.test(ua)) {
        $.active = 'Android';
        $.Android = /Android ([0-9\.]+)[\);]/.exec(ua)[1];
    }

    if (/webOS\//.test(ua)) {
        $.active = 'webOS';
        $.webOS = /webOS\/([0-9\.]+)[\);]/.exec(ua)[1];
    }

    if (/(Intel|PPC) Mac OS X/.test(ua)) {
        $.active = 'Safari';
        $.Safari = /(Intel|PPC) Mac OS X ?([0-9\._]*)[\)\;]/.exec(ua)[2].replace(/_/g, '.') || true;
    }

    if (/Windows NT/.test(ua)) {
        $.active = 'IE';
        $.IE = /Windows NT ([0-9\._]+)[\);]/.exec(ua)[1];
    }
    if (/MSIE/.test(ua)) {
        $.active = 'IE';
        $.IE = /MSIE ([0-9]+[\.0-9]*)/.exec(ua)[1];
    }
    if (/Trident/.test(ua)) {
        $.active = 'IE';
        $.IE = /Trident\/.*rv:([0-9]+[\.0-9]*)/.exec(ua)[1];
    }
    if (/Edge\/\d+/.test(ua)) {
        $.active = 'IE Edge';
        $.IE = /Edge\/(\d+)/.exec(ua)[1];
    }

    return $.active + ' ' + $[$.active] + ($.subactive && ' ' + $.subactive + ' ' + $[$.subactive]);
};

答案 12 :(得分:0)

您可能需要查看Apache DeviceMap

开箱即用的JavaScript库现在更多地在客户端,但很多将以类似的方式在Node.JS或Angular上工作。与UA字符串的简单模式匹配不同,DeviceMap在其基于W3C标准的设备描述存储库(DDR)中附带了大量设备和设备系列。

答案 13 :(得分:0)

强大的npm useragent。 通过使用Useragent,您可以使用手动调整的专用正则表达式进行浏览器匹配,从而以高精度解析用户代理字符串。需要此数据库来确保在每个浏览器供应商实现其自己的用户代理架构时正确解析每个浏览器。这就是为什么常规用户代理解析器存在重大问题的原因,因为它们很可能解析出错误的浏览器名称,或者将渲染引擎版本与浏览器的实际版本混淆。

答案 14 :(得分:0)

[这是供您考虑的另一种变化形式或同化形式。]

功能更广泛,进一步简化。

您可以传递Request或带有'headers'属性的任何对象,也可以是headers属性,并且可以选择任何标签来搜索对象,标题或实际用户代理字符串本身上的参数。< / p>

它使用了以前发布的Mobile and Table Checking Regex,并简单地返回了结果,但是通过首先将输入合法化,可以插入各种东西。

您甚至可以覆盖可选的默认正则表达式作为参数传递。 {我将进一步扩展到受启发的人。} 如果在范围等范围内,还有另一种默认方法可以默认从请求中全局存储用户代理。

mobTabCheck: function( ua, lbl, rgx ) {  /* mobile tablet check; UserAgent or request, or any object with optional search label  */
    if( ua === und ) return false;
    if( ua !== und && ua.constructor !== String ) {
        if( lbl === und ) lbl = 'user-agent';
        if( ua.headers !== und ) ua = ua.headers[ lbl ];
        else ua = ua[ lbl ];
    }
    if( rgx === und ) rgx = /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/;
    if( rgx.constructor === String ) rgx = new RegExp( rgx );
    return rgx.test( ua );
}

此正则表达式来自这里... https://gist.github.com/dalethedeveloper/1503252/931cc8b613aaa930ef92a4027916e6687d07feac

98%的解决方案。我不知道它是否像我的功能标题所暗示的那样检查平板电脑。

真的应该重命名此函数的标题(和某些参数)吗?... serachObjectForLabelThatMatchesThisRegex

除了所有默认值之外,它都使它成为单个参数专用的东西。

我也将函数集保留为键的值,您可以存储该值,但是您更喜欢...只要向我保证没有var或const即可。

let mobTabCheck = function() {};