浏览器野史 —— 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. 微软又玩新花样了,在泄露版 IE11 中,去掉了以往的 MSIE 字样。初步猜测此举是为了使现有的 CSS hack 失效,避免过去网页设计师对 IE 差别对待的情况再度发生。但又会引发其他问题啊亲。

注:本文转载自 Litten 的文章“浏览器野史 UserAgent 列传 (上) (下)” ,内容二合一,特此注明!