产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

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

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

关注

评论

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

消息收发弹性——生产集群如何解决大促场景消息收发的弹性&降本诉求

阿里巴巴云原生

阿里云 RocketMQ 云原生

从0到1介绍一下开源大数据比对平台dataCompare

诸葛子房

大数据 开源 低代码

iOS不想上架

雪奈椰子

ios打包

上架苹果

雪奈椰子

ios打包

ios新游上架

雪奈椰子

ios打包

做产品质量“守护神” 华为云CodeArts TestPlan测试管理平台解读

科技热闻

喜报|3DCAT入选“灵境杯”深圳市最佳元宇宙案例!

3DCAT实时渲染

虚拟现实 元宇宙 增强现实 实时云渲染 元宇宙开发

喜报 | 瑞云科技荣获“第四届天鸽奖十大创新企业”等两项大奖

3DCAT实时渲染

元宇宙 3DCAT 瑞云渲染

Seata 1.6.0 正式发布,大幅度提升存储性能

阿里巴巴云原生

阿里云 seata

Pytorch基础-张量基本操作

嵌入式视觉

张量的基本操作 维度变换 索引切片 合并分割 卷积相关算子

“数据库内核从入门到精通 ”系列课开讲!

阿里云数据库开源

开源数据库 polarDB PolarDB-X 阿里云数据库 PolarDB for PostgreSQL

软件测试/测试开发丨接口测试该怎么做?持证上岗的Charles,可以帮你做什么?

测试人

软件测试 自动化测试 接口测试 charles 测试发开

可以一学的代码优化小技巧:减少if-else冗余

华为云开发者联盟

JavaScript 前端 代码 华为云 企业号 1 月 PK 榜

npm 包 chalk-next 被开发者投毒,导致 SRC 目录被删

墨菲安全

npm 投毒 npm chalk-next chalk-next 投毒

软件测试/测试开发丨接口管理工具YApi怎么用?颜值高、易管理、超好用

测试人

软件测试 接口测试 YAPI 测试开发

Bonree ONE荣获信通院“2022IT新治理年度明星产品”

博睿数据

根因分析 博睿数据 荣誉奖项 Bonree ONE

RayLink远程控制软件:叮~你收到一份年度关键词报告

RayLink远程工具

远程控制软件 RayLink

初识PHP(1):PHP是什么

华为云PaaS服务小智

php

Pytorch基础-tensor数据结构

嵌入式视觉

Tensor torch.tensor() Tensor维度

浅析华为云基于HBase MTTR上的优化实践

华为云开发者联盟

大数据 后端 华为云 企业号 1 月 PK 榜

2022年度回顾 | 这一年,LigaAI写了10万字

LigaAI

程序员 产品经理 敏捷开发 2022年终总结 企业号 1 月 PK 榜

分久必合?数据库进入“超”融合时代 | 爱分析调研

YMatrix 超融合数据库

数据库 数字化转型 案例分享 超融合数据库 YMatrix

关于 Serverless 应用架构对企业价值的一些思考

阿里巴巴云原生

阿里云 Serverless 云原生

快速构造String对象及访问其内部成员的技巧

阿里技术

Java jdk FASTJSON2

Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

阿里巴巴云原生

Java 阿里云 容器 云原生

卷积神经网络的压缩方法总结

嵌入式视觉

知识蒸馏 模型压缩 神经网络参数量化 二值化网络 模型剪枝

湖南卫视携手华为云 打造跨年晚会“最炫科技风”

Geek_2d6073

软件测试/测试开发丨如何确保API 的稳定性与正确性?你只需要这一招

测试人

软件测试 自动化测试 测试开发 RESTful API

高性能存储SIG月度动态:DSMS开始适配Anolis OS、将在ANCK 5.10中支持ublk | 龙蜥 SIG

OpenAnolis小助手

开源 操作系统 高性能存储 龙蜥社区 sig

首汽约车驶向极速统一之路!出行平台如何基于StarRocks构建实时数仓?

StarRocks

数据库

广西首次!3DCAT实时云渲染助力南宁数字气象科普馆上线

3DCAT实时渲染

云计算 云渲染 元宇宙 3DCAT 虚拟数字气象馆

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