原文地址: https://webaim.org/blog/user-...译者:一篇有些年头的文章,如果你对于浏览器user agent的历史不甚了解(就像我),那么这篇文章对于你应该很有帮助,另外原文下的评论也很精彩
起初有款浏览器叫NCSA Mosaic,Mosaic自称为NCSA_Mosaic/2.0 (Windows 3.1)
,它可以显示一些图片和文字,这是很令人欣喜的。
后来,出现了一款名为Mozilla的新型网络浏览器,它的名字Mozilla是“Mosaic Killer”的缩写。但是Mosaic觉得这并不好笑,所以Mozilla便更名为Netscape,并且自称Mozilla/1.0 (Win3.1)
。Netscape
支持那些很流行的框架,但是Mosaic却不支持这些框架,因此当时就诞生了“user agent嗅探”,并且人们只向Mozilla的网站管理员贡献一些框架,而不向其他浏览器贡献。
然后,Netscape说道,让我们一起嘲笑一下微软,并且称Windows为“难以调试的设备驱动”,微软听到这些后很生气。所以微软就自研出了被称为Internet Explorer
(译者注:以下简称IE)的浏览器,并且希望这款浏览器成为Netscape killer
。虽然IE支持框架,但是它毕竟不是Mozilla,所以没有人为IE提供框架,为此微软变得不耐烦了,它不愿再等待那些网站管理员学习IE并且给它贡献框架,因此,IE宣布它是“兼容Mozilla”的并且开始模仿Netscape,同时它自称为Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)
,接下来IE就陆陆续续收到了其他处贡献的框架,微软全员为此都很高兴,但是同时网站管理员们却变得困惑了起来。
随后,微软就利用Windows来迅速扩张IE,同时让IE变得比Netscape更好,第一次浏览器大战在这片土地上爆发了。然后,Netscape公司就被干掉了,微软觉得很开心。但是Netscape却以Mizilla的名义东山再起了,前同事Mozilla研发了一款非常优秀的渲染引擎-Gecko
,并自称为Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826
。然后Mozilla诞生了我们熟知的Firefox,称其为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
。随后,Gecko开始大量被使用,其他浏览器也都开始使用它的代码,这些浏览器有的自称Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1
,有的自称Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0
,每一个都伪装成Mozilla,而且它们都是由Gecko驱动的。
后来,Gecko发展的很好,“user agent嗅探”又出现了,社区贡献给Gecko一些其他浏览器没有的很好的代码,所以此时IE又不行了。Linux爱好者们很难过,因为他们已经研发了Konqueror
,其引擎是KHTML
,他们认为它和Gecko
一样优秀,但是它毕竟不是Gecko
,所以它没有被提供一些好的页面,因此Konqueror
开始伪装成类Gecko型以获取一些好的页面,并且自称为Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)
,可以看到这有很多混乱的地方。
接着,Opera说道“我们确实应该允许用户来决定模拟哪个浏览器”,于是Opera创建了一个菜单项,并且自称为Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51
或者Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51, or Opera/9.51 (Windows NT 5.1; U; en)
,用户可以自行选择这两种类型。
随后,苹果公司研发了Safari,使用了KHTML
引擎,但是给引擎添加了很多功能特性,而且还把这个项目拆分了出来,称它为Webkit
,但是苹果公司依然希望为KHTML
编写页面,所以Safari称它自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5
,对比以上的混乱,情况变得更糟了。
微软非常害怕Firefox,所以它重新拾起了IE,称它为Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
,并且它呈现很好的代码,但是前提是网站管理员指示它这样做
然后,Google研发了Chrome,使用了Webkit
引擎,就像Safari一样,想要为Safari构建页面,所以它伪装成Safari。因此Chrome使用了Webkit
,并伪装成Safari,Webkit
伪装成KHTML
,KHTML
伪装成Gecko
,所有浏览器都假装是Mozilla,Chrome自称是Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
,user agent一团糟,几乎毫无用处,每一个都伪装成其他的样子,真真儿地混乱不堪
(全文完)
谈一些我的感想吧
就拿我自己的机子上的几个浏览器来说
- Chrome 69:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
- Safari 12:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15
- Firefox Nightly 59.0a1:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0
一眼望去,很繁琐而且很相似,而且我这还是一些当前主流浏览器,一些小众浏览器的ua可能会包含很多其他繁杂的信息
对于ua,其实以前没怎么关注过,偶然看到这篇文章后我才发现,这ua的历史真就像我们大多数的老项目的迭代一样呀,代码一层包一层,user agent一层包一层,你伪装成我,我伪装成它,导致它的识别很容易被欺骗,所以猜测用户正在使用的浏览器是一种很不靠谱的方式,如果能提供一种简单的、有效的、直接了当的方法来区分用户正在使用哪种浏览器那就最好了