写点什么

浏览器 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:003302
用户头像

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

关注

评论

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

发力新市民圈层,银行系消费金融这半年都有哪些行动?

易观分析

金融 银行

如何做好线上服务质量保障?

老张

软件测试 质量保障

【炫丽】从0开始做一个WPF+Blazor对话小程序

沙漠尽头的狼

有赞算SaaS平台吗?

产品海豚湾

产品经理 SaaS 产品运营 B端产品 11月月更

一道React面试题把我整懵了

beifeng1996

React

React源码分析8-状态更新的优先级机制

goClient1992

React

3分钟快速掌握Go语言正/反向代理的姿势

有态度的马甲

计算机网络:随机访问介质访问控制之ALOHA协议

timerring

计算机网络 11月月更 ALOHA

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

Java中的递归详解

共饮一杯无

Java 递归 11月月更

算法题学习---链表中的节点每k个一组

桑榆

算法题 11月月更

前端面试中小型公司都考些什么

loveX001

JavaScript

AJAX的作用和使用

格斗家不爱在外太空沉思

JavaScript ajax 11月月更

深入理解Metrics(一):Gauges

冰心的小屋

Java metrics Guages

鸿蒙开发实例 | 分布式涂鸦

TiAmo

华为 鸿蒙 云开发 11月月更

前端工程师的20道react面试题自检

beifeng1996

React

Java中的Iterator迭代器详解

共饮一杯无

Java 迭代器 11月月更

线上 hive on spark 作业执行超时问题排查案例分享

明哥的IT随笔

hadoop spark hive

从输入URL到渲染的完整过程

loveX001

JavaScript

前端打工人的面试总结

loveX001

JavaScript

从React源码分析看useEffect

goClient1992

React

数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比

Lansonli

数据湖 11月月更

docker-compose下的java应用启动顺序两部曲之二:实战

程序员欣宸

Docker Docker-compose 11月月更

随机森林-机器学习中调参的基本思想

烧灯续昼2002

Python 机器学习 算法 随机森林 11月月更

你需要的react面试高频考察点总结

beifeng1996

React

Cox 比例风险回归模型

heart_6662

11月月更 cox 生存分析 生物信息学

一天梳理完React所有面试考察知识点

beifeng1996

React

极客时间运维进阶训练营第一周作业

LiaoWD

dokcer

React源码分析8-状态更新的优先级机制

goClient1992

React

Java中的泛型详解

共饮一杯无

Java 泛型 11月月更

从异步讲起,『函数』和『时间』该作何关系?

掘金安东尼

前端 11月月更

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