浏览器User-Agent字符串的故事
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?
References:
- http://www.cnblogs.com/ifantastic/p/3481231.html 译文
- https://webaim.org/blog/user-agent-string-history/ 原文
- http://www.nowamagic.net/librarys/veda/detail/2576
故事还得从头说起,最初的主角叫NCSA Mosaic
,简称Mosaic
(马赛克),是1992年末位于伊利诺伊大学厄巴纳-香槟分校的国家超级计算机应用中心(National Center for Supercomputing Applications
,简称NCSA
)开发,并于1993年发布的一款浏览器。它自称“NCSA_Mosaic/2.0(Windows 3.1)
”,Mosaic
可以同时展示文字和图片,从此浏览器变得有趣多了。
然而很快就出现了另一个浏览器,这就是著名的Mozilla
,中文名称摩斯拉。一说Mozilla = Mosaic + Killer,意为Mosaic
杀手,也有说法是Mozilla = Mosaic & Godzilla,意为马赛克和哥斯拉,而Mozilla
最初的吉祥物是只绿色大蜥蜴,后来更改为红色暴龙,跟哥斯拉长得一样。但Mosaic
对此非常不高兴,于是后来Mozilla
更名为Netscape
,也就是网景。
Netscape
自称“Mozilla/1.0(Win3.1)
”,事情开始变得更加有趣。网景支持框架(frame),由于大家的喜欢框架变得流行起来,但是Mosaic
不支持框架,于是网站管理员探测user agent,对Mozilla
浏览器发送含有框架的页面,对非Mozilla浏览器发送没有框架的页面。
后来网景拿微软寻开心,称微软的Windows是“没有调试过的硬件驱动程序”。微软很生气,后果很严重。此后微软开发了自己的浏览器,这就是Internet Explorer
,并希望它可以成为Netscape Killer。IE
同样支持框架,但它不是Mozilla
,所以它总是收不到含有框架的页面。微软很郁闷很快就沉不住气了,它不想等到所有的网站管理员都了解IE并且给IE发送含有框架的页面,它选择宣布IE
是兼容Mozilla
,并且模仿Netscape
称IE
为“Mozilla/1.22(compatible; MSIE 2.0; Windows 95)
”,于是IE
可以收到含有框架的页面了,所有微软的人都嗨皮了,但是网站管理员开始晕了。
因为微软将IE
和Windows捆绑销售,并且把IE
做得比Netscape
更好,于是第一次浏览器血腥大战爆发了,结果是Netscape
以失败退出历史舞台,微软更加嗨皮。但没想到Netscape
居然以Mozilla
的名义重生了,并且开发了Gecko
,这次它自称为“Mozilla/5.0(Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826
”。Gecko
是一款渲染引擎并且很出色。Mozilla
后来变成了Firefox
,并自称“Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
”。Firefox
性能很出色,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
很出色,而IE
完全跟不上它,因此user agent探测规则变了,使用Gecko的浏览器被发送了更好的代码,而其他浏览器则没有这种待遇。Linux的追随者对此很难过,因为他们编写了Konqueror
,它的引擎是KHTML
,他们认为KHTML
和Gecko
一样出色,但却因为不是Gecko
而得不到好的页面,于是Konqueror
为得到更好的页面开始将自己伪装成“like Gecko”,并自称为“Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)
”。自此user agent变得更加混乱。
这时更有Opera
跳出来说“毫无疑问,我们应该让用户来决定他们想让我们伪装成哪个浏览器。”,于是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
”, 或者“Opera/9.51 (Windows NT 5.1; U; en)
”。
后来苹果开发了Safari
浏览器,并使用KHTML
作为渲染引擎,但苹果加入了许多新的特性,于是苹果从KHTML
另辟分支称之为WebKit
,但它又不想抛弃那些为KHTML
编写的页面,于是Safari
自称为“Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5
”,这进一步加剧了user agent的混乱局面。
因为微软十分忌惮Firefox
,于是IE
重装上阵,这次它自称为“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
”,并且渲染效果同样出色,但是需要网站管理员的指令它这么做才行。
再后来,谷歌开发了Chrome
浏览器,Chrome
使用Webkit
作为渲染引擎,和Safari
之前一样,它想要那些为Safari
编写的页面,于是它伪装成了Safari
。于是Chrome
使用WebKit
,并将自己伪装成Safari
,WebKit
伪装成KHTML
,KHTML
伪装成Gecko
,最后所有的浏览器都伪装成了Mozilla
,这就是为什么所有的浏览器User-Agent里都有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字符串变得一团糟,几乎根本无法彰显它最初的意义。追根溯源,微软可以说是这一切的始作俑者,但后来每一个人都在试图假扮别人,最终把User-Agent搞得混乱不堪。
各大浏览器诞生年表:
- 1993年1月23日:Mosaic
- 1994年12月:Netscape
- 1994年:Opera
- 1995年8月16日:Internet Explorer
- 1996年10月14日:Kongqueror
- 2003年1月7日:Safari
- 2008年9月2日:Chrome
\>\> update 20201111
由于User-Agent的混乱已经背离了初衷,Google计划逐步淘汰User-Agent。
原话是:
We want to freeze and unify (but not remove) the User Agent string in HTTP requests as well as innavigator.userAgent
参考:https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/u-YzXjZ8BAAJ?pli=1
或许不远的将来,UA称为一代人的唏嘘,如同IE6一般。