浏览器 user-agent 字符串的故事

#cnblogs_post_body p{
text-indent:2em; margin-top: 1em;
}

你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?

故事还得从头说起,最初的主角叫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

如果您觉得这文章对您有帮助,可以打赏点钱给我,鼓励我继续写一些高质量的博文


浏览器 user-agent 字符串的故事,布布扣,bubuko.com

时间: 2024-10-29 19:06:02

浏览器 user-agent 字符串的故事的相关文章

ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事

想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery.Validate这类的插件,当然也可以我们自己写. 后台验证就是ASP.NET自带的验证控件,如RequiredFieldValidator. 记得初学.NET的时候,那会儿接触验证控件,也知道验证分为前台,后台.但是随着时间的推移,由于做的项目基本上都是公司内部使用的软件,比如OA.因为这种项目

Chrome修改浏览器User Agent

对浏览器快捷方式右键->修改目标项为 C:\Users\LJ\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent="Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3 C:\Users\LJ\AppData\Local\Go

设置两个div是总是不能重合浏览器user agent stylesheet问题

如图 两个div之间总是有一个空行,设置了margin为0还是没卵用,f12调试发现 多了一个user agent stylesheet样式,经百度是浏览器自带的样式 重新为div内的元素ul设置css样式,margin为0,覆盖其原有的属性 参考文章:http://blog.csdn.net/gavin710/article/details/8810964

Chrome改动浏览器User Agent

对浏览器快捷方式右键->改动目标项为 C:\Users\LJ\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent="Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3 C:\Users\LJ\AppData\Local\Go

[转载]:Fortran字符串的故事

一. Fortran 字符串与 C 字符串的区别  Fortran的字符串处理能力其实很弱,关于字符串的语法还很落后.它与 C 字符串最大的区别就是:Fortran字符串是固定长度的,没有 \0 结束符.另外,Fortran 也不区分字符和字符串.即 'abc' 与 "abc" 是没有差别的. 二. Fortran 字符串的定义.  Fortran字符串是固定长度的.因此,在声明时,就必须指定长度.(如不指定,大多数编译器认为是长度为 1 的字符串)  声明时,可以按照这些格式进行:

jquery判断浏览器版本插件,jquery-browser.js

一.jquery判断浏览器版本插件,jquery-browser.js jquery 1.9 之后已经删除判断浏览器版本的方法: $.browser.msie $.browser.version 原因是: 注意:通过user agent字符串来检测浏览器不是一个好主意,在1.9中将完全移除该方法,不过你可以使用jQuery Migrate(迁移)插件.或者你可以试试Modernizr. 但如果想用怎么办呢? 二.解决方法: 复制下面的代码,保存为jquery-browser.js,在jquery

改Chrome的User Agent,移动版网络

理论上访问手机版或者iPad等平板电脑版的网络,应该可以剩些流量的,毕竟移动网络是经过优化压缩的,但是PC电脑如果访问移动版的网站呢?我主要使用的浏览器是Chrome,这几天也找了下Chrome下的修改方法,设置User Agent参数轻松把Chrome伪装成Android,iPhone,iPad等移动设备,访问针对移动版的网站.   修改方式比较常见的都是很长的一段参数,比如:   把Chrome伪装模拟成iPad, 修改Chrome的快捷方式,在快捷方式>目标一栏最后添加如下User Age

获取浏览器版本号和型号

工作中需要通过JS去获取当前使用的浏览器的名字以及版本号,网上大堆资料都有一个关键词是 navigator.appName,但是这个方法获取的浏览器的名字只有两种要么是IE要么就是Netscap,倒是可以用来判断是否使用了IE,但是我想获取具体的浏览器产品名字比如  Firefox,Chrome等.所以只好通过navigator.userAgent,但是这个字符串是非常长的,分析他的特征,通过正则表达式来解决这个问题是不错的方法. (1) 获取浏览器名字+版本字符串 function getBr

企业内网IE浏览器兼容性支持和加速方法

修改IE浏览器配置加速IE浏览器: 取消"对证书地址不匹配发出警告"勾选取消"检查服务器证书是否已吊销*"勾选取消"检查提交的POST重定向到不允许发送到的区域时发出警告"勾选取消"在安全和非安全模式之间切换时发出警告"勾选取消"检查发行商的证书是否吊销"勾选取消“允许运行和安装程序,即使签名无效”勾选取消"检查下载的程序的签名"勾选取消"启动弹出窗口阻止程序"勾选关