服务器端浏览器检测? 的node.js
我见过的大多数实现都是在客户端浏览器检测。 我只是想知道是否可以在发送任何资源给客户端之前进行浏览器检测。
谢谢。
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];
这应该适合你。 只要把它放在你的响应处理程序。
节点的uaparsing器库( npm install ua-parser
)为浏览器用户代理string公开了大量的正则expression式。 我强烈推荐它,以满足您的需求。
我用ua-parser-js把它们扔在了一起。 我相信它可以改进,但function。
安装软件包:
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可以得到的其他信息,请查看他们的演示页面。
我想做一个简单的redirect到我的网站的移动版本,所以user-agent足够可靠。 我想做服务器端,所以我没有浪费时间在客户端加载不必要的CSS和JS。 http://detectmobilebrowsers.com/有最强大的正则expression式匹配。; 所以我把一些快递中间件放在一起,只要在你的应用中添加两行代码,就可以让你做redirect。
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
这是另一个: https : //github.com/koudelka/node-useragent_parser
如果你使用快递,你可以很容易地检查这样的事情:
app.get('/ua', function(req, res){ res.send('user ' + req.headers['user-agent']); });
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';
大多数浏览器提供一个名为“User-Agent”的HTTP请求头。这与客户端的navigator.userAgent属性相同。
如果你想在模板层控制移动,我只是写了一个模块。 https://github.com/Fresheyeball/isMobile-node
我改进了一点@鸭子酱的代码,实际上是有用的,并支持IE 10-12(边缘)。
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]); };
您可能想看看Apache DeviceMap 。
开箱即用的JavaScript库现在更多地位于客户端,但是类似的方式,Node.JS或Angular也可以使用更多的JavaScript库。 与UAstring的简单模式匹配不同,DeviceMap在其基于W3C标准的设备描述信息库(DDR)中提供了大量的设备和器件系列。