天天看點

浏覽器 User-Agent 字元串的故事

你是否好奇辨別浏覽器身份的User-Agent,為什麼每個浏覽器都有Mozilla字樣?

故事還得從頭說起,最初的主角叫NCSA Mosaic,簡稱Mosaic(馬賽克),是1992年末位于伊利諾伊大學厄巴納-香槟分校的國家超級計算機應用中心(National Center for Supercomputing Applications,簡稱NCSA)開發,并于1993年釋出的一款浏覽器。它自稱“NCSA_Mosaic/2.0(Windows 3.1)”,Mosaic可以同時展示文字和圖檔,從此浏覽器變得有趣多了。

然而很快就出現了另一個浏覽器,這就是著名的Mozilla,中文名稱摩斯拉。一說 Mozilla = Mosaic + Killer,意為Mosaic殺手,也有說法是 Mozilla = Mosaic & Godzilla,意為馬賽克和哥斯拉,而Mozilla最初的吉祥物是隻綠色大蜥蜴,後來更改為紅色暴龍,跟哥斯拉長得一樣。但Mosaic對此非常不高興,于是後來Mozilla更名為Netscape,也就是網景。Netscape自稱“Mozilla/1.0(Win3.1)”,事情開始變得更加有趣。網景支援架構(frame),由于大家的喜歡架構變得流行起來,但是Mosaic不支援架構,于是網站管理者探測user agent,對Mozilla浏覽器發送含有架構的頁面,對非Mozilla浏覽器發送沒有架構的頁面。

後來網景拿微軟尋開心,稱微軟的Windows是“沒有調試過的硬體驅動程式”。微軟很生氣,後果很嚴重。此後微軟開發了自己的浏覽器,這就是Internet Explorer,并希望它可以成為Netscape Killer。IE同樣支援架構,但它不是Mozilla,是以它總是收不到含有架構的頁面。微軟很郁悶很快就沉不住氣了,它不想等到所有的網站管理者都了解IE并且給IE發送含有架構的頁面,它選擇宣布IE是相容Mozilla,并且模仿Netscape稱IE為“Mozilla/1.22(compatible; MSIE 2.0; Windows 95)”,于是IE可以收到含有架構的頁面了,所有微軟的人都嗨皮了,但是網站管理者開始暈了。

因為微軟将IE和Windows捆綁銷售,并且把IE做得比Netscape更好,于是第一次浏覽器血腥大戰爆發了,結果是Netscape以失敗退出曆史舞台,微軟更加嗨皮。但沒想到Netscape居然以Mozilla的名義重生了,并且開發了Gecko,這次它自稱為“Mozilla/5.0(Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826”。Gecko是一款渲染引擎并且很出色。Mozilla後來變成了Firefox,并自稱“Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0”。Firefox性能很出色,Gecko也開始攻城略地,其他新的浏覽器使用了它的代碼,并且将它們自己稱為“Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/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。

Gecko很出色,而IE完全跟不上它,是以user agent探測規則變了,使用Gecko的浏覽器被發送了更好的代碼,而其他浏覽器則沒有這種待遇。Linux的追随者對此很難過,因為他們編寫了Konqueror,它的引擎是KHTML,他們認為KHTML和Gecko一樣出色,但卻因為不是Gecko而得不到好的頁面,于是Konqueror為得到更好的頁面開始将自己僞裝成“like Gecko”,并自稱為“Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)”。自此user agent變得更加混亂。

這時更有Opera跳出來說“毫無疑問,我們應該讓使用者來決定他們想讓我們僞裝成哪個浏覽器。”于是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.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51”, 或者“Opera/9.51 (Windows NT 5.1; U; en)”。

後來蘋果開發了Safari浏覽器,并使用KHTML作為渲染引擎,但蘋果加入了許多新的特性,于是蘋果從KHTML另辟分支稱之為WebKit,但它又不想抛棄那些為KHTML編寫的頁面,于是Safari自稱為“Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5”,這進一步加劇了user agent的混亂局面。

因為微軟十分忌憚Firefox,于是IE重裝上陣,這次它自稱為“Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ”,并且渲染效果同樣出色,但是需要網站管理者的指令它這麼做才行。

再後來,谷歌開發了Chrome浏覽器,Chrome使用Webkit作為渲染引擎,和Safari之前一樣,它想要那些為Safari編寫的頁面,于是它僞裝成了Safari。于是Chrome使用WebKit,并将自己僞裝成Safari,WebKit僞裝成KHTML,KHTML僞裝成Gecko,最後所有的浏覽器都僞裝成了Mozilla,這就是為什麼所有的浏覽器User-Agent裡都有Mozilla。Chrome自稱為“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字元串變得一團糟,幾乎根本無法彰顯它最初的意義。追根溯源,微軟可以說是這一切的始作俑者,但後來每一個人都在試圖假扮别人,最終把User-Agent搞得混亂不堪。

各大浏覽器誕生年表:

1993年1月23日:Mosaic

1994年12月:Netscape

1994年:Opera

1995年8月16日:Internet Explorer

1996年10月14日:Kongqueror

2003年1月7日:Safari

2008年9月2日:Chrome

英文:webaim