写点什么

浏览器 user-agent 简史

  • 2017-12-24
  • 本文字数:1809 字

    阅读完需:约 6 分钟

很多人都知道浏览器的 user-agent 字符串,服务器端通过这个字符串进行客户端的浏览器、操作系统、加密等级、浏览器语言、渲染引擎和版本信息的识别。从 1993 年 NCSA 发布首款浏览器 Mosaic 以来,这个字符串经历了纷繁复杂的变化,以下是 user-agent 字符串的演变简史。

1993 年,NCSA 公司发布了首款浏览器 Mosaic,使用“NCSA_Mosaic/2.0(Windows 3.1)”作为 user-agent 字符串。

后来 Mozilla 浏览器问世,“Mozilla”意即“Mosaic Killer”,意思是要成为 Mosaic 浏览器的终结者。Mosaic 自然不太高兴,于是 Mozilla 就把名字改成 Netscape,并把 user-agent 改为“Mozilla/1.0(Win 3.1)”。那个时候 frame 标签很流行,Netscape 支持 frame,但 Mosaic 不支持,于是出现了“用户代理嗅探”,如果字符串中带有“Mozilla”字样,服务器就发送 frame 给浏览器,否则就不发送。Netscape 还开起了微软的玩笑,笑称 Windows 是“缺少调试的设备驱动器”,微软很生气,于是开发了自己的浏览器 Internet Explorer,希望能够成为“Netscape Killer”。

IE 也支持 frame,但它的 user-agent 字符串中没有包含“Mozilla”,所以服务器不会发送 frame 给 IE。微软没有太大耐心,他们就想着怎样才能尽快让服务器也能向 IE 发送 frame,于是他们把 IE 声明为与“Mozilla 兼容”的浏览器,并使用了“Mozilla/1.22(compatible;MSIE 2.0;Windows 95)”的字符串。这样,IE 就能够收到 frame,微软现在开心了,但其他人却一头雾水。微软将 IE 捆绑在 Windows 上销售,销量比 Netscape 要好得多,于是第一场浏览器大战爆发了。

Netscape 在这场大战中落败,不过经过了一场浴火重生,变成了 Mozilla。Mozilla 开发了 Gecko 渲染引擎,并把 user-agent 改为“Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826”。

再后来,Mozilla 变成 Firefox,并把 user-agent 改为“Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0”。Gecko 开始多元化发展,其他浏览器也开始使用它的代码,并使用了“Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Comino/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 越来越好,但 IE 没有,于是出现了新一轮的用户代理嗅探,声称自己使用了 Gecko 内核的浏览器总能收到更好的 HTML 代码,但其他浏览器就没这么好的待遇。

Linux 的拥护者感到很伤心,因为他们开发了 Konqueror,它使用了 KHTML 引擎,他们认为它比 Gecko 好。可惜的是,它不是 Gecko,所以收不到好的页面。于是 Konqueror 开始佯装“Gecko”,使用了“Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)”作为 user-agent 字符串。

然后 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.81.) Gecko/20061208 Firefox/2.0.0 Opera 9.51”、“Opera/9.51 (Windows NT 5.1; U; en)”。

苹果开发了 Safari 浏览器,以 KHTML 为基础,添加了很多新特性,并创建了一个分支,叫作 WebKit。为了能够获得 KHTML 页面,Safari 称自己为“Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5”。

经历了惨败,IE 再次回归,这次它把字符串改为”Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)”,这样就能够接收到好的页面。

谷歌后来开发了 Chrome 浏览器,它使用了 WebKit,有点像 Safari。为了获得 Safari 那样的页面,它佯装自己是 Safari,于是使用了字符串“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 字符串变得越来越复杂,也越来越让人摸不着头脑,只因为各个浏览器在争相“佯装”对方。

查看原文 History of the browser user-agent string


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-12-24 18:003324
用户头像

发布了 322 篇内容, 共 154.0 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

如何从ElasticSearch迁移到OpenSearch?

天翼云开发者社区

大数据

如何在YashanDB中实现与区块链的集成

数据库砖家

如何在YashanDB中有效处理时序数据

数据库砖家

人工智能技术全景:从基础理论到前沿应用的深度解析

野猪🐗 佩琪

如何在YashanDB数据库中使用索引优化查询效率

数据库砖家

如何在YashanDB中集成数据可视化工具

数据库砖家

如何在YashanDB中实施高效的数据清洗

数据库砖家

如何在YashanDB中实现多租户架构的设置?

数据库砖家

黑龙江通信行业如何办理等保

等保测评

从0到1打造问答机器人:RAG全流程代码详解与优化基准

聚客AI学院

人工智能 langchain RAG应用 rag实战 RAG 框架

如何在YashanDB中管理数据模型变更

数据库砖家

如何在YashanDB中实施高效的存储管理?

数据库砖家

如何在YashanDB中实现多级缓存策略

数据库砖家

如何在企业中有效地实施YashanDB

数据库砖家

如何最大化YashanDB数据库的存储性能

数据库砖家

FinClip驱动全球生态基建:中国企业出海的小程序化流量入口构建范式

xuyinyin

开启元宇宙养宠新纪元!黑猫宇宙如何用“AI+GameFi”重构Web3时代的数字伴侣?

股市老人

如何在YashanDB中实现跨平台数据访问

数据库砖家

开源能源管理系统对于现在行业的重要性

开源能源管理系统

开源 能源管理系统

如何在YashanDB中实现数据趋势预测

数据库砖家

黑龙江等保要求?需要什么安全产品

等保测评

如何在YashanDB中使用SQL实现复杂查询

数据库砖家

如何办理黑龙江等保备案

等保测评

如何在YashanDB数据库中使用JSON数据类型?

数据库砖家

如何在YashanDB中管理用户权限与角色

数据库砖家

如何在YashanDB中建立业务智能的支持系统

数据库砖家

如何在YashanDB中实现数据分区管理

数据库砖家

如何在YashanDB中实现自动化备份?

数据库砖家

如何在YashanDB中实施版本控制以保障数据管理

数据库砖家

如何在YashanDB中实现灵活的数据建模?

数据库砖家

如何制定YashanDB数据库的维护与管理计划

数据库砖家

浏览器user-agent简史_语言 & 开发_Aaron Andersen_InfoQ精选文章