本文转载至 Litten 博客 的《浏览器野史 UserAgent列传(上)(下)》,七年过去了依旧是经典好文。

某天,我做一个小项目,需要判断一下浏览器类型。简单的呀。
控制台敲下:navigator.userAgent
浏览器回应:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36

天,这串是啥?你怎么连话都说不清楚?

我对userAgent并不陌生,但明明一个单词就可以说清楚的事情,却是这么掏心掏肺的回答。怪可怜的,一定有冤情。

后来我查阅了很多资料,发现历史非常的精彩。

大事年表

  • 1990年: Nexus(WorldWideWeb)诞生
  • 1993年1月23日:Mosaic诞生
  • 1994年12月:Netscape(Mozilla)诞生
  • 1995年4月:Opera诞生
  • 1995年8月16日:Internet Explorer诞生
  • 2002年9月23日:Firefox诞生
  • 2003年1月7日:Safari诞生
  • 2008年9月2日:Chrome诞生

一、盘古开天地

很久很久之前,上古大神Berners-Lee发明了WorldWideWeb,即万维网。同时,李大神也发明了第一款浏览器。真是具有跨时代意义的工具呀,好伟大呀,人们在想,叫什么好呢?
但大神就是大神,大神内心的想法又岂是尔等凡人能够肆意揣摩?

万万没想到,李大神说,我这浏览器,也叫WorldWideWeb!不行么?
行行行。

虽然李大神起名字这么拽,但他后来发觉,还是得赋予一点承上启下的历史意义,就改名成“Nexus”。值得注意的是,这浏览器,居然是可以兼容Unix跟Microsoft DOS的。它在当时流行的各种电脑上跑得飞起,应用也越来越广,被称为“杀手级应用”。杀手级…你们看互联网一开始就是这么的腥风血雨。

但这个浏览器,还不支持图片的显示,这是出现UserAgent的导火索。

二、唐尧虞舜

93年,伊利诺大学的NCSA组织认为,浏览器无图无真相,这不好。因而他们发明了第一款可显示图片的浏览器。
真是具有跨时代意义的工具呀,好伟大呀,人们在想,叫什么好呢?
但大神就是大神,大神就是连起名字都让你惊心动魄。

NCSA组织说,它能显示图片,偏偏我们就要叫它“马赛克(Mosaic)”!不行么?
行行行。

但有人就问了,Nexus不显示图片,Mosaic能显示,你们让html提供者怎么写代码?你们是不是想逼死选择困难症患者?有没有考虑过天秤座的感受?

因而UserAgent就诞生了。Mosaic将自己标志为NCSA_Mosaic/2.0 (Windows 3.1),大家该怎么写代码就怎么写,但请求会带上这个信息,服务器就知道该不该返回能显示图片的html。UserAgent君,出生时跟我们设想的一样简单,仅仅标明了自己是什么浏览器,在什么系统运行,以及各自的版本号。

新旧浏览器们像彬彬有礼的君王,商议和让位是为了更好的繁荣。但风雨欲来。

三、楚汉争霸

像刘邦一样,走出来一个搅局的小流氓。当然他还是很有志向的,他的目标,就是战胜霸主Mosaic。后来,他还真的做到了。
如今,所有现代浏览器的UserAgent里都有它的标志,就像汉朝之后,我们都称为“汉”人。一群很有天赋的程序员,一起缔造了它的辉煌。

真是具有跨时代意义的工具呀,好伟大呀,人们在想,它叫什么呢?
但大神就是大神,大神就是让你永远也猜不到他们想了个什么名字。
大神们说,叫Mozilla,不行么?
行。但什么意思呢?

含义有二。其一,哥斯拉(Godzilla)谐音,诚然是一头野心勃勃的怪兽;其二,”Mosaic Killa”之意,Killa是俚语中Killer的拼法,即“马赛克的终结者”,赤裸裸的挑战。

惊呆了的Mosaic小心翼翼的念着Mozilla这发音:“Mo…摸咋了?”勃然大怒,“摸你妹!”

鉴于Mosaic当时的权势,Mozilla改名成Netscape Navigator(网景航海家)。小怪兽突然变成有点文艺小清新的名字,郁闷得很,但内心的血液沸腾着。虽然叫大名叫网景,但它把UserAgent偷偷设置成Mozilla/1.0 (Win3.1)。还是摸咋了?咬我?

四、宋元之战

很快,NetScape战胜了Mosaic,成为了新的霸主,因为其更优的展示。
NetScape最先支持了html框架显示,就是简单的table布局,内外边距之类,仅仅这点就将Mosaic抛诸身后。区别这两个浏览器,还是用的UserAgent。如果是UserAgent里含有“Mozilla”字样,那就发送支持框架的页面,否则,就发送不含框架的页面。

NetScape帝国日益庞大,歌舞升平,一切风平浪静,直到微软的铁骑挥军南下。

微软发布了一款跟系统强绑定的浏览器,真是具有跨时代意义的工具呀,好伟大呀,人们在想,它叫什么呢?
不用想了,就是IE。这命名也相当简单粗暴,Internet Explorer,直接把这工具的用途拍在你脸上。连说明书都可以免了。

IE也是支持html标准框架的,但由于前面的历史原因,人们只会给UserAgent里含有“Mozilla”字样的浏览器发送含框架的页面。但这点小事能难倒我大微软?IE呵呵一笑,把自己的UserAgent改成Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)。看,我这里也有“Mozilla”字样,也能收到含框架的页面了!

当然,这个小流氓行为,跟后来把IE和Windows捆绑一起销售的大流氓行为比起来,根本不为足道。后面的故事我们也知道了,IE把NetScape干掉了。但它的身体上,却永远的烙上了“Mozilla”的印记。

五、康乾盛世

看过奥特曼的都知道,怪兽被打败了会再回来。别忘了NetScape曾拥有一批大神们,失败后,他们围绕着浏览器排版引擎Gecko(壁虎)成立了非正式组织Mozilla。小怪兽再次出发。大神们发明了另一款优秀的浏览器,它在插件拓展和开发调试领域做出的贡献,绝对可以载入互联网历史。

真是具有跨时代意义的工具呀,好伟大呀,人们在想,它叫什么呢?
但大神就是大神,大神就是即使你知道了Mozilla的命名都是野兽,却还是猜不到是什么。
Mozilla说,我们浴火重生,叫Phoenix(凤凰)!不行么?
真不行。

刚推出就被人告了,原来已经有一家公司叫做“凤凰科技”。
Mozilla瀑布汗,改名叫Firebird(火鸟)!还不行么?
我们得原谅一下他们的取名,虽然现在看来满满的山寨感,可放在那个时代,Firebird这名字很炫酷。就像你当初的QQ昵称叫赤炎天使感觉依然良好一样。

但是,他们发现,业内有个数据库系统,也叫的Firebird…泪流满面的Mozilla感慨重生好难呀。最后才决定叫Firefox(火狐)。

基于Gecko引擎的Firefox非常优秀,为了告诉大家,我使用了这个引擎,它标志自己的UserAgent为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
这时候的UserAgent,虽然长了点,但它并不混乱,准确的标明了系统,排版引擎,浏览器名称等信息。虽然IE这时已经占有了很大的市场份额,但基本停步不前;而Mozilla经过一段时间的修生养息,Firefox在业内广受好评,得到了快速的发展。

时值2003年,web2.0的浪潮前夕,浏览器的发展达到了空前的盛世。
然而所谓否极泰来,盛极则衰。涅槃的Firefox迎来盛世,却又恰恰由于盛世,决定了UserAgent纠结的命运。


六、师夷长技

前面说到,微软靠Windows系统捆绑IE销售。而Windows自然也有它的对手,Linux。一个技术快速发展的时代,系统的世界里也是战火纷飞。Linux系统自从有了可视化界面,也需要浏览器呀。桌面系统KDE的缔造者们就发明了一个。

真是具有跨时代意义的工具呀,好伟大呀,人们在想,它叫什么呢?
但大神就是大神,大神就是讲究先从文字上占据压垮你的气势。
先有Navigator航海家,再有Explorer探索者,咱就叫Konqueror(Conqueror的变体)征服者吧。
行行行。我已懒得理这帮大神…

可是,问题来了。Konqueror使用KHTML排版引擎,即使它们认为自己跟Gecko引擎一样优秀,但用户不买单。你UserAgent里没有“Gecko”字样,我就不给你经过优良排版的html。
结果,Konqueror思来想去,做了一个艰难但很萌的决定,把UserAgent写成Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)
这就是现代浏览器里like Gecko这一萌词的由来。

就这样,伟大的排版引擎KHTML为了获得更好的资源,师夷长技。这并没什么不好,却造成了UserAgent的越发混乱。
KHTML与Gecko这一对,永远卿卿我我比翼双飞在UserAgent里面了。那个满含深意的“like”,有人觉得翻译成“像”,但也有人觉得应该是“喜欢”…

七、世界大战

首先是IE冷静下来了,他觉得,你们不带这么玩的?
就我年少时不懂事,首先改了个Mozilla字样,后面追究这历史我岂不是成了罪魁祸首?我改还不行吗?
在IE6,它明确自己UserAgent为Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)。除去已经注定不可抹去的“Mozilla”字样,其余信息简洁,准确,清晰。

但事态已经不可收拾。

Opera给这狂躁的世界添了一把火。它觉得,易容术非常炫酷呀。Opera直接在菜单提供了Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51Opera/9.51 (Windows NT 5.1; U; en)三个选择项。第一个是易容成IE,第二个是易容成火狐,第三个才是自己,选谁就是谁!

其实这并不是一件坏事。因为Opera是站在能够让用户通过选择,去获得更好的浏览体验的基础上的。你提供选择,或是不提供,混乱的UserAgent还是在这,不离,不弃。再者,这对网页的开发者有极大的好处,在某些情况,你不必同时打开几个不同的浏览器去调试。到目前,最新的Chrome浏览器更加炫酷,能够支持近40种不同的UserAgent,甚至你还可以自定义。当然这是后话。

与此同时,苹果公司依靠内核WebKit,开发出Safari,命名UserAgent为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5

有人就会问了,不是Webkit内核吗,怎么还有KHTML, like Gecko?注意,内核Webkit包含了一个排版引擎叫WebCore,而WebCore是KHTML衍生而来的。也就是说,WebCore是KHTML的儿子,子承父业,基因差不多。为了能够正常排版,safari只能这么写。

后来,google也开发了自己的浏览器Chrome,其内核也是Webkit,但它设定UserAgent为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。Safari一看,不对劲啊!你怎么也在后面写有Safari?Chrome呵呵一笑,你懂的。

因此,请让我一口气说完下面这一段:
Chrome希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。

这就是整个UserAgent世界大战的格局…

八、军阀混战

将目光聚焦到国内,更是狼烟四起,混乱不堪。大家都知道,浏览器是互联网的入口,这块肥肉谁也不想丢。因而一个接一个的“国产”浏览器进入斗兽场。
360,百度,QQ,UC,搜狗,猎豹,遨游,世界之窗…你能说出一大堆。连淘宝,酷狗,hao123都有浏览器,不信你搜。
注意我前面“国产”两个字必须加上双引号,因为这个made in china并不纯。国人并没能像远古大神一样,硬生生发明一个内核出来,我们更擅长“微创新”。

利用Trident(IE的内核),包装一下皮肤,美化一下,就可以说:完美兼容
利用Webkit,包装一下皮肤,美化一下,就可以说:极速浏览
把两个内核都包起来,就可以说:智能双核

是微创新!读书人的事,能叫偷吗?

在这插播一下,浏览器的“双核”,并不是你听说手机双核电脑双核那回事。再多个核,速度也不会更快,当然这么说,会显得很厉害的样子。德艺双馨,智勇双全,名利双收,才貌双绝,夫妻双双把家还,你看带“双”字的词都很牛的。

但我上面的叙述,的确有夸张的成分。浏览器的诞生,肯定不仅仅是包一下皮肤那么简单,国内的工程师们,也苦心研究做了许多工作。如果要说优化策略,我可以再写一篇超级长的文章。优化无止境,路漫漫其修远,向同行们致敬。只是我非常讨厌那些不把事实说清楚,纯粹靠文案去忽悠人的产品…

话说回来,这么多国产浏览器,总得靠不同UserAgent标志自己呀。
大家自动分为两个阵营:使用Trident内核的,在IE已有UserAgent后添加自己的名称;使用Webkit内核的,就在Chrome的UserAgent后面添加。

前者像QQ浏览器:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.7.26717.400)
后者像猎豹:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER
当然双核浏览器诚然就是墙头草,切换内核时UserAgent也需要跟着变化。

如此的混战格局,这厢的IE和Chome想必也是醉了。

九、国共内战

适者生存是不变的生存法则,国产浏览器们经过一段时间的用户筛选,自然优胜劣汰。时值2010年,真正还在运营和更新的浏览器数量慢慢下降,用户集中在几家表现更优异的厂商手中。就在这时,好看的故事来了——3Q大战爆发。

有人说,腾讯电脑管家的推出是导火索。其实这场仗,大家都忍了好久,推不推出,都一定会在某个事件后爆发。360浏览器是奇虎的重量级产品,用户量众多,2009年它推出一个功能:过滤其它网站的广告。诚然民众们都很喜欢。可是其他互联网公司肯定就不乐意了,用户看不到更点击不到广告,这钱还怎么赚?

因而在3Q大战爆发后,腾讯的一个手段就是:如果你使用360浏览器,就不能访问QQ的网站(单单QQ空间就有巨大的用户量),也直接反攻360的最大收入来源。一个艰难的决定背后,往往是需要无数种的技术战略支撑的。企鹅判断用户是否使用360浏览器,依靠的就是UserAgent里是否有“360SE”的字样。

战报传来:号外,360浏览器上不了QQ空间!已经买了黄钻的杀马特贵族急了呀!只能换浏览器了呀!感覺侢乜卟哙噯嘞呀!
2011年11月3日,腾讯网站封杀360浏览器
2011年11月4日,360浏览器访问量仅为昨日一半
2011年11月5日,360浏览器访问量几乎为0

有人说,腾讯就这么快赢了?恰恰相反,360浏览器通过一次强制的自动升级,又可以访问QQ的网站了。360的工程师们在5日使用了伪装术——把“360SE”字样从UserAgent中去掉!
意思就是,360浏览器的UserAgent跟IE完全一样,你根本判断不出来(因而访问量为0)。就怕流氓有文化!企鹅傻眼了,总不能把大微软的IE也一并给禁了吧…

这场土匪遇恶霸的耍流氓大战,最终通过法律而化解。企鹅在技术侧拿360没办法,而360则得到了一个跟IE一样的身份证。在这场内战中,受伤的除了广大网民们,其实还有令人心疼UserAgent君,以往让它越长越长就算了,这次长了还得阉割掉,真心dan疼呀。

十、明日边缘

看到这里,大家会明白一个道理:如果未来不出现一款霸主级别的浏览器(或内核),UserAgent应该不会有大变化了。
不过,这道理并不全对。别忘了,移动侧也是有浏览器的。
在早期能上网的手机里,内置了各手机厂商自研的浏览器。这些浏览器并不需要像PC一样的复杂设计,可以访问wap网页就足够了。因而它们的UserAgent命名,怎么简单怎么来,就直接叫诺基亚 3100 Nokia3100/06.01 (UCWEB 3.3B) PHILIPS755 ObigoInternetBrowser/2.0 这样,有甚者连浏览器叫什么都不带 TCL-3199三星 E618 SEC-SGHE618

这样任由发展下去,一种要历史重演,往日重现的即视感压迫而来。
web世界的联合国——W3C组织,站在明日边缘,面对着历史和未来,终于发话,它制定UserAgent标准,以后都得按这规范去起名字。详细请阅User Agent Accessibility Guidelines。至此,命运坎坷的UserAgent终于逐步走向规范。W3C大法好,有人说你怎么不早点来拯救世界呀!其实W3C一直在努力,但规范的制定,到推广至大家认可并执行,是一条漫长的道路,需要时间,也需要实践。
W3C组织,在制定web标准这件工作之外,再我看来,还有两个身份:1、和事佬;2、背黑锅。和事不成,就得背黑锅。是的就是这样。

彩蛋

那么,我们的故事接近尾声。还有一些有趣的小彩蛋。

  1. Chome 28开始,与苹果正式分道扬镳,采用Blink内核,但它的UserAgent并不改变。
  2. 淘宝封杀微信打开淘宝页面,靠的就是微信内置浏览器UserAgent里的MicroMessenger字样。其实微信也可以像当初360一样把UserAgent去掉,但微信并不这样做。
  3. 360出招之时留有后招。也许,它一开始就想到了腾讯会告他们对于UserAgent的欺瞒,因而它其实提供了设置项。默认设置是“保持跟IE一样的UserAgent”,但用户也可以不勾选。只是这选项比较隐蔽,而且你重启浏览器后…又会变回默认设置。如果没有这个小小的设置,结果大家可以自行想象。
  4. 微软又玩新花样了,在泄露版IE 11中,去掉了以往的MSIE字样。初步猜测此举是为了使现有的 CSS hack 失效,避免过去网页设计师对IE差别对待的情况再度发生。但又会引发其他问题啊亲。

End.
Litten 2014.10.5