问题背景
今天在翻看浏览器内核问题的时候发现了挺有意思的现象,这是我电脑上几个浏览器的UA:
Firefox
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:129.0) Gecko/20100101 Firefox/129.0'
Safari
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15'
Chrome
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
Edge
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'
我特意按照长短排了个序列,此刻我内心有几个疑问:
- 为啥这些UA前面长的都一样,既然都一样那为啥还要写,另外这都啥意思呀?
- 为啥Firefox UA里只有Firefox,但是Chrome UA里面不仅有Chrome还有Safari,Edge更过分,里面不仅有Edg(不知道为啥不是Edge),还有Safari和Chrome
- 继续上一个问题,大家都这么长,为啥Firefox UA这么短
- 为啥Safari、Chrome、Edge都有KHTML, like Gecko这句,这里面的like Gecko又是啥意思
内容略长,如果你懒得看,可以直接拉到最后看答案。
好了,有了一堆问题之后我开始向谷歌请教,于是我看到了下面这篇文章
文章以下部分摘自 奔跑中的奶酪的《互联网的“套娃行为”有多凶残? 3 分钟解惑》一文
一、浏览器 UA 的诞生
要讲清楚这个话题,我们要从 1990 年说起。
1990 年,英国计算机科学家蒂姆·伯纳斯·李巧妙地提出了 HTTP 协议,然后又编写了世界上第一个浏览器 World Wide Web,万维网就此诞生。
1993 年,美国超级电脑应用中心(NCSA)推出了一款叫做 Mosaic(马赛克) 的浏览器。
它第一次将图片与文字同时在一起展示,从此,浏览器就开始变得好玩起来。
为了发挥 Mosaic 浏览器的图片优势。
Mosaic 浏览器在访问网页时,会事先向网页服务器发送一段特定的字符串来标记自己。
这样使用 Mosaic 的用户,就能收到有图片的内容。
这个字符串 Mosaic/2.0(Windows 3.1)就是 UserAgent,简称 UA,中文叫作“用户代理”。
从此,浏览器 UA 作为一种“根据用户软硬件环境,进而采用不同内容策略”的技术,诞生了。
二、浏览器 UA 的伪装
2.1、Mozilla 浏览器
1994 年,Mosaic 项目的核心成员马克·安德森离职,然后发布了一款全新的浏览器 Mozilla。
Mozilla 除了是 Godzilla 的谐音外,它还是 Mosaic Killa 的缩写,意思是要做 Mosaic 的终结者。
然而在 Mosaic 的压力之下, Mozilla 还是改名为了 Netscape 浏览器。
不过在设置浏览器 UA 时,Netscape 还是使用了 Mozilla 的名字,也就是:Mozilla/1.0 (Win3.1) 。
接着,Netscape 浏览器还率先支持了网页框架技术。
而其他它浏览器要么不支持,要么支持得不够好,Netscape 很快成为当时最流行的浏览器。
2.2、IE 浏览器
1995 年,微软宣布进军互联网,并发布了 IE 浏览器。
然而,尽管 IE 浏览器同样也支持框架技术,但总是收不到有框架的页面。
原因是网页服务器会先检测浏览器 UA 中是否包含 Mozilla 字符,如果有,就发送有框架的页面,没有就不发送。
微软等不及市场的反应,于是直接在 IE 浏览器的 UA 中加入了 Mozilla,也就是:
Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)
于是,IE 浏览器就能正常接收到有框架的页面了。
从此,浏览器 UA 也成为了解决浏览器兼容性的一个重要手段。
三、浏览器 UA 的演变
3.1、Firefox 浏览器
没过多久,微软采用了将 IE 与 Windows 捆绑销售的策略,Netscape 浏览器被打败退出历史舞台。
不甘失败的 Netscape 团队,在 2004 年又推出了一款全新的浏览器 Firefox。
Firefox 使用的 Gecko 引擎非常优秀。
为了告诉大家,我使用了这个引擎,于是 Firefox 在浏览器 UA 里加入了:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041108 Firefox/1.0。
3.2、KHTML 浏览器
而由于 IE 止步不前,慢慢地,浏览器 UA 的探测规则发生了变化。
使用 Gecko 引擎的浏览器可以得到更好的网页代码,而其它的浏览器则没有这种待遇。
Linux 的追随者对此感觉难过,因为他们开发了好用的 KHTML 引擎,但却因为不是 Gecko 而得不到好的页面。
于是宣布 KHTML 兼容 Gecko(like Gecko),浏览器 UA 就变成了:
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko) 。
3.3、Opera 浏览器
一直使用自主 UA 的浏览器 Opera,也同样遇到了这样的问题。
但 Opera 不是简单地把自己也标记为 Gecko,而是主张让用户来决定变成什么样的浏览器。
于是 Opera 在菜单里增加了浏览器 UA 的选项,让用户来选择是变成 IE 还是 Firefox,又或者是它自己本体。
3.4、Safari 浏览器
2003 年,苹果公司从 KHTML 引擎中分支出来了 Webkit,然后开发了 Safari 浏览器。
为了兼容性的考虑,苹果将 KHTML 内核 UA 中 的 Mozilla、KHTML、Gecko 统统继承了下来,变成了:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5
3.5、Chrome 浏览器
2008 年,谷歌使用了苹果的 Webkit 引擎开发出了 Chrome 浏览器。
Chrome 浏览器也想兼容那些专为 Safari 编写的页面,于是就继承了 Safari 的 UA,然后再加入自己的 UA:
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。
3.6、Edge 浏览器
如果要问谁是“伪装之王”,那一定非 Edge 莫属了。
2020 年,微软转用谷歌的 Chromium 内核开发 Edge 浏览器,为了不再受兼容性的困扰,Edge 浏览器几乎将所浏览器的 UA 都加入了进来,于是就有了:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.70 Safari/537.36 Edg/90.0.818.38
3.7、浏览器 UA 伪装
如果把浏览器 UA 伪装,比作是“俄罗斯套娃”的话,你会发现:
Edge 伪装成 Chrome,Chrome 伪装成 Safari,Safari 伪装成 KHTML,KHTML 伪装成 Gecko。
Gecko 和 IE 又伪装成 Mozilla。
最终,所有浏览器的 UA 都以 Mozilla 开头。
尽管,Mozilla 作为一个浏览器而言,早已从市场上消失。
摘录部分结束
看到这里我明白了:
[气愤!]原来这浏览器UA就TM是个典型的屎山!明明原先只有Mosaic/2.0(Windows 3.1)这么短的UA愣是被各种兼容搞成了现如今这副屎样。
不过气愤归气愤,开头困扰我的那些问题也算都解决了。
结论
1.问:为啥这些UA前面长的都一样,既然都一样那为啥还要写,另外这都啥意思呀?
答:我们先来解释是啥,再解释为啥。UA里面相同的部分是这段Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15)
。这里面后半段是操作系统和版本,自不必多言,前面那部分呢,是这样的:Mosaic浏览器(一个古早浏览器)的一个研发大佬单飞了,搞了Mozilla浏览器,Mozilla它是 Mosaic Killa 的缩写,意思是要做 Mosaic 的终结者(老大摊手:就是这么吊),设置UA的时候用的就是Mozilla/1.0 (Win3.1) 。经过了数年迭代,升个级,叫Mozilla/5.0也很合情合理对吧。至于UA前面为啥都长这样,以及为啥都要写上,相信我这是为了兼容。
2.问:为啥Firefox UA里只有Firefox,但是Chrome UA里面不仅有Chrome还有Safari,Edge更过分,里面不仅有Edg(不知道为啥不是Edge),还有Safari和Chrome
答:这个问题的回答总结就是:兼容。Safari为了兼容,继承了Mozilla、KHTML、like Gecko这套;而Chrome为了兼容Safari(没想到啊,Safari比Chrome还早),所以包含了Safari那套;而Edge又为了兼容前面的,于是继续套娃。那为啥Firefox UA里只有Firefox,因为他自成一派,不用兼容,具体看问题4的回答.
3.问:继续上一个问题,大家都这么长,为啥Firefox UA这么短?
答:Firefox祖上阔、发家早、传承久,成了老字号,一直叫这名字。现在这么短全是全同行衬托的。
4.问:为啥Safari、Chrome、Edge都有KHTML, like Gecko这句,这里面的like Gecko又是啥意思
答:当时Firefox的Gecko引擎老牛了,Mozilla就骄傲的把它写进UA里面了,然后他还发展的好;而KHTML也是一个棒棒哒排版引擎,但是发展略慢,为了发展于是决定兼容Gecko(没错又是兼容),所以他们在UA里面不仅写了KHTML,还加了一句link Gecko,表示我兼容Gecko了(原先的兼容就是这么简单直接)。
其实还有一个问题,不是说safari是webkit内核,chrome是blink内核吗?为啥都写KHTML,其实webkit、blink都源自KHTML,这么写也没毛病,至于为啥不改过来,那必然还是为了兼容。而KHTML、webkit、blink这些内核则是另一个分家再分家的故事,如果你感兴趣可以看这篇文章 历史在重演:从KHTML到WebKit,再到Blink。
最最后我要感慨一句:身处屎山之中,抱怨屎山,理解屎山,成为屎山。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。