最近web界被红芯事件吵得沸沸扬扬,也激起了我对浏览器内核进一步的学习热情。
先来看看user-agent,它是我们前端开发获取用户操作系统,浏览器版本等数据的常用方法:
UA存在于每次http请求的请求头中,像这样
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
根据MDN上的描述,上面的字段有着多种多种声明信息,大致分以下几块
1. Mozilla/5.0
这是浏览器通用标识,几乎所有浏览器都会带,至于为什么,这里有一篇有趣的文章 —— 为什么浏览器User-agent总是有Mozilla字样——User-agent String里的历史故事。大致上是说早年Mozilla浏览器支持一些好的技术,所以网页开发者会对它和其它浏览器区别对待,这引发了其它浏览器厂商的不满,又没法普及自己浏览器的支持性,就冒充Mozilla以获得更好的浏览体验。
2. (Windows NT 10.0; WOW64)
括号里是操作平台,包含了浏览器运行所在平台的操作系统,比如win10 64位,这里还可以包含手机操作系统;如
(iPhone; CPU iPhone OS 11_0 like Mac OS X) 这是iphone6的操作平台操作系统位OS11
3. AppleWebKit/537.36 (KHTML, like Gecko)
第三部分就是我们最常说的内核(渲染引擎/排版引擎,Rendering Engine),也就是HTML的排版引擎,对浏览器来说有着举足轻重的作用,目前市场上的内核主要有
- Trident —— 它是IE浏览器的标志之一,国内的双核浏览器的兼容模式用的就是Trident。
- Gecko —— 由NetScape公司研发,目前由Mozilla基金会开发维护的开源项目,曾经红极一时的Firefox就是使用的它。
- Webkit —— 由苹果公司研发,是目前最强大,最普及也最时尚的浏览器内核,市场占有率很高,像safari / edge / Chrome 等都用的appleWebkit。
- Blink —— 由谷歌推出,与opera合作开发的新浏览器内核(2013年),现今两者都用的blink。这也是为了摆脱对webkit的依赖和保护浏览器生态(webkit2与chrome沙箱设计模式发生冲突造成的)。
有趣的是,chrome和opera虽然用的blink内核,但在user-agent上却没有体现(仍然写的appleWebkit)。这也是为了兼容性,web开发者都习惯了将webkit作为兼容性最好的内核, 为了更好地浏览器体验,就沿用了webkit字段。
4. Chrome/67.0.3396.99 Safari/537.36
这是浏览器的版本,表示至少支持以上两个浏览器版本。
总结:这个user-agent里并非所有字段都真实,各浏览器厂商为了更好地兼容,各种伪装,是的UA显得很混乱,所以字段内容要适当采选,避免bug。