问题

为什么所有主要浏览器的 User-Agent 都是 Mozilla/x.0 开头?

回答
我们平时上网冲浪,每个浏览器在访问网站时都会给网站发送一个“身份标识”,就像你跟人打招呼会说“你好,我是XXX”一样,这个身份标识就是 UserAgent 字符串。你有没有注意到,无论你是用 Chrome、Firefox、Edge 还是 Safari,这个字符串的开头几乎都是一模一样的:“Mozilla/5.0” 或者 “Mozilla/5.0 (…)。这就像全世界都说“你好”开头一样,很有意思。

为什么会这样?这背后其实是一段历史和一些妥协。

一切都要从 Netscape Navigator 说起

故事要回到 1990 年代中期。那个时候,互联网还在起步阶段,浏览器也五花八门。其中最出名、最流行的是一个叫做 Netscape Navigator 的浏览器。可以这么说,它开创了图形化浏览器的先河,就像后来的 iPhone 之于智能手机一样,是当时绝对的王者。

当时的网站开发者,为了让自己的网页在不同的浏览器上显示效果更好,或者说,为了让自己的网站只在某些浏览器上显示,需要一种方法来识别用户使用的是什么浏览器。于是,浏览器就开始发送 UserAgent 字符串。

Netscape Navigator 当时使用的 UserAgent 字符串大概是这样的:`Mozilla/2.0`。这个 `Mozilla` 的名字其实很有意思,它来自 Netscape 的母公司 Mosaic Communications Corporation(后来改名为 Netscape Communications Corporation),“Mosaic” 是他们之前一个非常重要的项目。

为了兼容而生的“马甲”

很快,微软也推出了自己的浏览器,叫做 Internet Explorer (IE)。 IE 在起步阶段,相对于 Netscape Navigator 来说,功能和兼容性都有不少差距。很多网站开发者在制作网页时,会专门针对 Netscape Navigator 进行优化。为了让 IE 也能被很多网站“认可”,并且能够正常显示那些为 Netscape 定制的页面,微软采取了一个非常聪明的(或者说狡猾的)做法:让 IE 也冒充 Netscape Navigator。

所以,早期的 IE 在发送 UserAgent 字符串时,就模仿了 Netscape Navigator,直接写上了 `Mozilla/1.2` 或者类似的字符串。这样,那些检测到“Mozilla”开头的网站,就会把 IE 当成是 Netscape 来对待,从而让 IE 能够显示大部分网站的内容。

历史的惯性:Mozilla/5.0 成为事实上的标准

随着时间的推移,Netscape Navigator 发展到了版本 4.0,而 IE 也不断更新,推出了自己的版本。为了继续保持兼容性,其他浏览器也纷纷效仿。大家逐渐发现,只要 UserAgent 以 `Mozilla` 开头,并且包含一个看起来比较新的版本号,就能获得比较好的兼容性。

在 Netscape Navigator 的发展历程中,有一个重要的版本是 Netscape Navigator 5.0。虽然这个版本在实际发布时经历了一些波折,但它的用户代理字符串,或者说当时大家普遍认为的“比较新的 Netscape 版本”,`Mozilla/5.0`,逐渐成为了一个被广泛接受的“通用标识”。

于是,当其他浏览器想要加入这个大家庭,并且希望自己的用户能够顺畅地访问大多数网站时,它们也开始在自己的 UserAgent 中包含 `Mozilla/5.0`。

Firefox 最早是从 Netscape Navigator 的一个开源项目(Mozilla Application Suite)发展而来的,所以它很自然地继承了 `Mozilla/5.0` 这个前缀,并且后面会加上自己具体的版本信息,例如 `Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0`。
Chrome 最开始是基于开源的 WebKit 渲染引擎(后来发展为 Blink),而 WebKit 本身就对 Netscape 的 UserAgent 字符串有所支持。为了更好地兼容,Chrome 也加入了 `Mozilla/5.0` 的前缀,并且也会明确自己是 Chrome,例如 `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36`。
Safari 作为苹果的浏览器,虽然是独立开发的,但在早期也受到 Netscape 的影响,同样采用了 `Mozilla/5.0` 的前缀。
Edge 微软的现代浏览器,现在基于 Chromium 开源项目,所以它也沿用了 Chrome 的做法,包含 `Mozilla/5.0`。

那为什么会有后面的其他信息?

你可能会注意到,`Mozilla/5.0` 后面还跟着很多其他信息,比如操作系统、浏览器版本、渲染引擎等等。这些信息才是真正用来识别浏览器具体类型和版本的关键。

例如:
`Windows NT 10.0` 表示操作系统是 Windows 10。
`AppleWebKit/537.36 (KHTML, like Gecko)` 表示使用的是 WebKit 渲染引擎(Chrome 和 Safari 都用)。
`Chrome/114.0.0.0` 是 Chrome 的具体版本号。
`Safari/537.36` 表示它也兼容 Safari 的一些特性。

总结一下就是:

1. Netscape Navigator 是开创者,它在早期使用了 `Mozilla/x.0` 的 UserAgent。
2. 为了兼容性,IE 选择了模仿,也加上了 `Mozilla` 前缀。
3. `Mozilla/5.0` 成为了事实上的“通行证”,为了让新浏览器能够被大多数网站正确识别和显示,大家都纷纷效仿,在 UserAgent 中加上 `Mozilla/5.0`。
4. 后面的具体信息才是真正标识浏览器身份的关键,但 `Mozilla/5.0` 这个开头,就像是一种历史的“习惯”,被保留了下来,保证了绝大多数网站的兼容性。

所以,下次你看到 UserAgent 字符串时,就知道这个 `Mozilla/5.0` 并不是说你的浏览器就是 Mozilla 的产品,而是它在努力和整个互联网“打招呼”,确保自己能被这个世界好好对待。这就像一个古老的约定,大家都在遵守,虽然原因可能已经不那么重要了。

网友意见

user avatar

作者: iFantasticMe 链接:浏览器 user-agent 字符串的故事 来源:博客园 - 开发者的网上家园 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36 Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)

故事还得从头说起,最初的主角叫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搞得混乱不堪。

一句话结论:因为网站开发者可能会因为你是某浏览器(这里是 Mozilla),所以输出一些特殊功能的程序代码(这里指好的特殊功能),所以当其它浏览器也支持这种好功能时,就试图去模仿 Mozilla 浏览器让网站输出跟 Mozilla 一样的内容,而不是输出被阉割功能的程序代码。大家都为了让网站输出最好的内容,都试图假装自己是 Mozilla 一个已经不存在的浏览器……

附各大浏览器诞生年表:

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

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有