你是否好奇标识浏览器身份的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

注:本文转自简明现代魔法。

http://www.icultivator.com/p/8908.html

为什么浏览器User-agent总是有Mozilla字样——User-agent String里的历史故事相关推荐

  1. 为什么每个浏览器的 User-Agent 都有 Mozilla 字样?—— User-Agent混乱发展史

    在解释 "为什么每个浏览器的 User-Agent 都有 Mozilla 字样?" 之前先贴一段目前常见的浏览器 User-Agent . Chrome|谷歌浏览器 Mozilla ...

  2. 为什么每个浏览器的User-Agent都有Mozilla字样

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ...

  3. [转]为什么浏览器User-agent总是有Mozilla字样

    今天早上查看处理UA的内容,看到这篇文章,实在是太有意思了,转载过来,分享给大家. 你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 ( ...

  4. 为什么浏览器User-agent总是有Mozilla字样

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ...

  5. 为什么浏览器的user-agent字符串以'Mozilla'开头呢?

    这是一篇技术文章的翻译+再创作,原文链接[link] 如果熟悉元素审查的童鞋,很多都会发现request headers中的user-agent基本都是以'Mozilla'开头的 如我把博客编辑器元素 ...

  6. linux+agent卸载_Symantec Backup Exec 2012 Agent for Linux 卸载 - 潇湘隐者

    本文介绍一下如何卸载Symantec Backup Exec 2012 Agent for Linx.首先我们来看看Symantec_Backup_Exec2012管理员手册的文档介绍: 卸载 Age ...

  7. 阿里one java agent的可插拔java agent运行

    基于one java agent的可插拔java agent方案 背景 第⼀阶段:⾃研微服务 阿⾥巴巴的微服务拆分实践进⾏的很早,从 2008 年就开始了,当时的单体应⽤已经⽆法承载业务迭代的速度,由 ...

  8. 浏览器市场再起烽火 Mozilla能否撼动IE?

    也许你已经不记得上一次浏览器之争的时间了,毕竟微软的IE在浏览器市场一统天下的格局保持了太久的时间,几乎都让消费者麻木了,忘记了还有其它浏览器产品的存在. 不过浏览器市场的烽火有望再度燃起.理由很简单 ...

  9. Chrome浏览器在开发者工具中如何设置User Agent

    在DeVTools界面中点击右侧三个小点 ,在弹出的对话框中选择More tools,接着点击Network conditions选项,操作如下图所示: 点击Network conditions选项之 ...

最新文章

  1. 转载CSDN - 从程序员到HR——面试经验分享
  2. 俞敏洪+摆脱恐惧+世界想让你做一个平凡的人、你信了吗
  3. dex文件结构(三):dex文件差分包分成
  4. 如何测试一个空的JavaScript对象?
  5. 透过源码看Session
  6. Python入门教程之文件读写操作知识
  7. 通过 T3 协议使用 WebLogic RMI
  8. 清默网络linux班,linux笔记(26)grep
  9. (1).数据结构概述
  10. 霸榜!Google发布语义分割新数据集!
  11. 用模板类实现shared_ptr和unique_ptr
  12. [渝粤教育] 西南科技大学 财务会计 在线考试复习资料
  13. 让chrome浏览器支持ajax跨域
  14. roboware studio教程_使用roboware创建工作空间
  15. 智伴机器人wifi键在哪里_智伴机器人介绍和按键功能
  16. android qq 邮箱格式,QQ邮箱格式怎么写
  17. WireShark抓取网站用户名和密码
  18. 计算机工作的本质是什么?
  19. Python爬虫(二)——urllib库,Post与Get数据传送区别,设置Headers,urlopen方法,简单爬虫
  20. 性能测试——结果量含义(系统吞吐量(TPS)、用户并发量)

热门文章

  1. Linux无线网络管理命令(ip/iw/iwconfig/iwlist/ifconfig/wpa_supplicant)
  2. html input文本框样式,css设置input文本框样式代码实例_html/css_WEB-ITnose
  3. 大过年睡不着,聊聊云开发入门
  4. linuX Lspci查看网卡,Linux使用ifconfig或lspci获取网卡信息
  5. 快卸载美图秀秀,它会收集并出售你的个人信息
  6. 用0和1书写新金融体系,DeFi的火焰已无法熄灭
  7. linux .net程序,.Net程序跑在Linux上
  8. 【微信小程序开发】自定义tabBar案例(定制消息99+小红心)
  9. 小米生态链与网络两大定律
  10. SpringBootTest报错:No qualifying bean of type...expected at least 1 bean which qualifies as autowire