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

Javascript 服务器端浏览器检测?node.js,javascript,browser,node.js,browser-detection,Javascript,Browser,Node.js,Browser Detection,我见过的大多数实现都是用于客户端的浏览器检测。我只是想知道在向客户端发送任何资源之前是否可以进行浏览器检测 谢谢 大多数浏览器都提供一个名为“用户代理”的HTTP请求头,这与客户端的navigator.userAgent属性相同 var ua = request.headers['user-agent'], $ = {}; if (/mobile/i.test(ua)) $.Mobile = true; if (/like Mac OS X/.test(ua)) {

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


谢谢

大多数浏览器都提供一个名为“用户代理”的HTTP请求头,这与客户端的navigator.userAgent属性相同

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];

那应该对你有用。只需将其放在响应处理程序中。

尝试此代码。

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

这里还有另一个:

如果您使用express,您可以很容易地使用以下内容检查ua:

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

我想做一个简单的重定向到我的网站的移动版本,这样用户代理就足够可靠了。我想在服务器端完成,这样就不会浪费时间在客户端加载不必要的css和js。拥有最强大的正则表达式。因此,我集成了一些express中间件,它可以让您通过向应用程序添加两行代码来实现重定向

npm安装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

如果您想在模板层控制移动设备,我刚刚为此编写了一个模块。

我使用了。我相信它可以改进,但它的功能

安装软件包:

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();
}

如果你想了解UAParser还能提供哪些其他信息,请查看他们的

我改进了一点@duck5auce的代码,使其真正有用并支持IE 10-12(Edge)


你可能想看看

现在,现成的JavaScript库更多地位于客户端,但在Node.JS或Angular上也会以类似的方式工作。与UA字符串的简单模式匹配不同,DeviceMap在其基于W3C标准的设备描述库(DDR)中提供了大量的设备和设备系列。

我几个月前发布了该产品

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

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

安装

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);
看看。

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

[这里是另一种变体或同化,供您考虑。]

它更加通用,并且进一步简化

您可以使用“headers”属性传递请求或任何对象,也可以是headers属性,您可以选择任何标签来搜索对象上的参数、标题或实际的用户代理字符串本身

它使用了之前发布的Mobile和Table-Checking正则表达式,并简单地返回结果,但通过首先对输入进行认可,可以插入各种内容

您甚至可以选择性地重写默认正则表达式作为参数。{我将把进一步的扩展留给受启发的人。} 此外,如果在范围内,还可以使用另一种方法从请求中默认为全局存储的用户代理

这个正则表达式来自这里。。。

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

这个函数的标题(和一些参数)应该是rename-maybe?。。。SerachObjectForLabelHattatMatchesthisregex

除了所有的默认值,它是一个单一的参数目的的东西

此外,我将函数集保留为键的值,您可以按自己喜欢的方式存储它。。。只要答应我,如果你使用它,就没有var或const

let mobTabCheck = function() {};

@使用UA检测浏览器是一种坏习惯,而且不稳定。我建议您查看CSS
@media
属性的委托,以便您可以为移动和非移动设备提供不同的CSS。@Raynos如果我们计划为使用不同代码库的移动web应用提供服务,该怎么办?也许我们应该合并这两个代码基?如果用户代理不符合预期的字符串,此脚本将引发异常。例如,ZXing QRCode阅读器使用用户代理字符串“ZXing(Android)”,这会导致/Android([0-9\.]+)[;]/.exec(ua)[1]上出现空指针异常。我已经相应地调整了代码。对于任何寻找设备检测的人,我以前都成功地使用过类似的方法:节点实现在哪里?@MattFletcher这就是你要寻找的吗?我想自从我最初发布这个答案以来,在3年多的时间里,情况发生了变化。这是2015年。现在有没有一个更全面的图书馆。我想检测moz、webkit、ie,我想检测移动设备、台式机、平板电脑,或者这个软件包?你怎么认为?很抱歉我在上面的评论。lib没有问题,如果我没有设置
X-ua-Compatible
meta标签,就给我发一个“假IE7UA”。
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);
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 );
}
let mobTabCheck = function() {};