AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

android LifeCycle-简单使用和详细原理解析,2021大厂Android面试经历

android 程序员 移动开发

Android Material Design尝鲜,阿里P8面试官都说太详细了

android 程序员 移动开发

Android NDK 开发之 CMake 必知必会,后台开发Android岗

android 程序员 移动开发

Android Retrofit 2,flutter游戏源代码

android 程序员 移动开发

Android Studio真机 设置 和 错误排查,安卓面试题最新2020

android 程序员 移动开发

Android Studio项目用Git上传至码云(OSChina)(1),flutter面试题

android 程序员 移动开发

Android NDK之旅——图片高斯模糊,30岁以后搞Android已经没有前途

android 程序员 移动开发

android RoundedBitmapDrawable最简单方式实现圆角,事件分发机制流程图

android 移动开发

企业很难招到合适的员工,怎么办?

低代码小观

招聘 企业管理 企业招聘 招聘系统 招聘管理系统

Android Studio安装更新终极解决方式,android开发从入门到精通第2版

android 程序员 移动开发

《设计模式就该这样学》之使用策略模式重构电商折扣和支付场景

Java高级开发

程序员 设计模式 java

Android Studio 3,android通知栏自响应事件

android 程序员 移动开发

Android Studio上Kotlin的入门,一次关于JVM的面试经历

android 程序员 移动开发

Android MTK 设置默认启动 Launcher,android实战pdf

android 程序员 移动开发

会声会影VS剪映?免费虽好,但花钱的快乐你想象不到!

懒得勤快

Flutter性能监控实践

贝壳大前端技术团队

flutter 性能 监控 优化

Android R 新特性变化,三级缓存框架问题你都了解了吗

android 程序员 移动开发

读完这些“Java 技术栈”,拿下阿里 Offer 没问题

Java高级开发

java

iOS开发-百度一面总结

iOSer

ios iOS面试 ios开发 百度面试

Android Studio 4,移动开发平台

android 程序员 移动开发

计算机网络小知识集锦 Ⅰ(厕所读物系列)

Regan Yue

计算机网络 11月日更 厕所读物

rabbitmq的死信队列

小鲍侃java

11月日更

Android Studio安装及问题解决,一文搞懂JVM架构

android 程序员 移动开发

Android PinnedHeaderListView 详解,flutter技术解析与实战

android 程序员 移动开发

Android Studio 4(1),Android面试超详细知识点

android 程序员 移动开发

2021年11月墨天轮国产数据库排行榜:openGauss闯入前三,Kingbase流行度与日俱增,TDengine厚积薄发

墨天轮

opengauss TiDB oceanbase 国产数据库

Android OKHttp 可能你从来没用过的拦截器 【实用推荐】

android 程序员 移动开发

Android OOM:内存管理分析和内存泄露原因总结,网易架构师深入讲解Android开发

android 程序员 移动开发

耗时两个月,我终于把牛客网最火的Java面试题整理成册了,在Github标星60K

Sakura

Java 程序员 架构 面试 后端

Android RecyclerView的简单使用,我的阿里手淘面试经历分享

android 程序员 移动开发

Android Studio 模拟器卡慢、占内存解决方法,35岁技术人如何转型做管理

android 程序员 移动开发

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