瀏覽器野史 UserAgent列傳
某天,我做一個小專案,需要判斷一下瀏覽器型別。簡單的呀。
控制檯敲下:navigator.userAgent
瀏覽器回應:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
天,這串是啥?你怎麼連話都說不清楚?
我對userAgent並不陌生,但明明一個單詞就可以說清楚的事情,卻是這麼掏心掏肺的回答。怪可憐的,一定有冤情。
後來我查閱了很多資料,發現歷史非常的精彩。
大事年表
- 1990年: Nexus(WorldWideWeb)誕生
- 1993年1月23日:Mosaic誕生
- 1994年12月:Netscape(Mozilla)誕生
- 1995年4月:Opera誕生
- 1995年8月16日:Internet Explorer誕生
- 2002年9月23日:Firefox誕生
- 2003年1月7日:Safari誕生
- 2008年9月2日:Chrome誕生
一、盤古開天地
很久很久之前,上古大神Berners-Lee發明了WorldWideWeb,即全球資訊網。同時,李大神也發明了第一款瀏覽器。真是具有跨時代意義的工具呀,好偉大呀,人們在想,叫什麼好呢?
但大神就是大神,大神內心的想法又豈是爾等凡人能夠肆意揣摩?
萬萬沒想到,李大神說,我這瀏覽器,也叫WorldWideWeb!不行麼?
行行行。
雖然李大神起名字這麼拽,但他後來發覺,還是得賦予一點承上啟下的歷史意義,就改名成“Nexus”。值得注意的是,這瀏覽器,居然是可以相容Unix跟Microsoft DOS的。它在當時流行的各種電腦上跑得飛起,應用也越來越廣,被稱為“殺手級應用”。殺手級…你們看網際網路一開始就是這麼的腥風血雨。
但這個瀏覽器,還不支援圖片的顯示,這是出現UserAgent的導火索。
二、唐堯虞舜
93年,伊利諾大學的NCSA組織認為,瀏覽器無圖無真相,這不好。因而他們發明了第一款可顯示圖片的瀏覽器。
真是具有跨時代意義的工具呀,好偉大呀,人們在想,叫什麼好呢?
但大神就是大神,大神就是連起名字都讓你驚心動魄。
NCSA組織說,它能顯示圖片,偏偏我們就要叫它“馬賽克(Mosaic)”!不行麼?
行行行。
但有人就問了,Nexus不顯示圖片,Mosaic能顯示,你們讓html提供者怎麼寫程式碼?你們是不是想逼死選擇困難症患者?有沒有考慮過天秤座的感受?
因而UserAgent就誕生了。Mosaic將自己標誌為NCSA_Mosaic/2.0 (Windows 3.1)
,大家該怎麼寫程式碼就怎麼寫,但請求會帶上這個資訊,伺服器就知道該不該返回能顯示圖片的html。UserAgent君,出生時跟我們設想的一樣簡單,僅僅標明瞭自己是什麼瀏覽器,在什麼系統執行,以及各自的版本號。
新舊瀏覽器們像彬彬有禮的君王,商議和讓位是為了更好的繁榮。但風雨欲來。
三、楚漢爭霸
像劉邦一樣,走出來一個攪局的小流氓。當然他還是很有志向的,他的目標,就是戰勝霸主Mosaic。後來,他還真的做到了。
如今,所有現代瀏覽器的UserAgent裡都有它的標誌,就像漢朝之後,我們都稱為“漢”人。一群很有天賦的程式設計師,一起締造了它的輝煌。
真是具有跨時代意義的工具呀,好偉大呀,人們在想,它叫什麼呢?
但大神就是大神,大神就是讓你永遠也猜不到他們想了個什麼名字。
大神們說,叫Mozilla,不行麼?
行。但什麼意思呢?
含義有二。其一,哥斯拉(Godzilla)諧音,誠然是一頭野心勃勃的怪獸;其二,”Mosaic Killa”之意,Killa是俚語中Killer的拼法,即“馬賽克的終結者”,赤裸裸的挑戰。
驚呆了的Mosaic小心翼翼的念著Mozilla這發音:“Mo…摸咋了?”勃然大怒,“摸你妹!”
鑑於Mosaic當時的權勢,Mozilla改名成Netscape Navigator(網景航海家)。小怪獸突然變成有點文藝小清新的名字,鬱悶得很,但內心的血液沸騰著。雖然叫大名叫網景,但它把UserAgent偷偷設定成Mozilla/1.0 (Win3.1)
。還是摸咋了?咬我?
四、宋元之戰
很快,NetScape戰勝了Mosaic,成為了新的霸主,因為其更優的展示。
NetScape最先支援了html框架顯示,就是簡單的table佈局,內外邊距之類,僅僅這點就將Mosaic拋諸身後。區別這兩個瀏覽器,還是用的UserAgent。如果是UserAgent裡含有“Mozilla”字樣,那就傳送支援框架的頁面,否則,就傳送不含框架的頁面。
NetScape帝國日益龐大,歌舞昇平,一切風平浪靜,直到微軟的鐵騎揮軍南下。
微軟釋出了一款跟系統強繫結的瀏覽器,真是具有跨時代意義的工具呀,好偉大呀,人們在想,它叫什麼呢?
不用想了,就是IE。這命名也相當簡單粗暴,Internet Explorer,直接把這工具的用途拍在你臉上。連說明書都可以免了。
IE也是支援html標準框架的,但由於前面的歷史原因,人們只會給UserAgent裡含有“Mozilla”字樣的瀏覽器傳送含框架的頁面。但這點小事能難倒我大微軟?IE呵呵一笑,把自己的UserAgent改成Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)
。看,我這裡也有“Mozilla”字樣,也能收到含框架的頁面了!
當然,這個小流氓行為,跟後來把IE和Windows捆綁一起銷售的大流氓行為比起來,根本不為足道。後面的故事我們也知道了,IE把NetScape幹掉了。但它的身體上,卻永遠的烙上了“Mozilla”的印記。
五、康乾盛世
看過奧特曼的都知道,怪獸被打敗了會再回來。別忘了NetScape曾擁有一批大神們,失敗後,他們圍繞著瀏覽器排版引擎Gecko(壁虎)成立了非正式組織Mozilla。小怪獸再次出發。大神們發明了另一款優秀的瀏覽器,它在外掛擴充和開發除錯領域做出的貢獻,絕對可以載入網際網路歷史。
真是具有跨時代意義的工具呀,好偉大呀,人們在想,它叫什麼呢?
但大神就是大神,大神就是即使你知道了Mozilla的命名都是野獸,卻還是猜不到是什麼。
Mozilla說,我們浴火重生,叫Phoenix(鳳凰)!不行麼?
真不行。
剛推出就被人告了,原來已經有一家公司叫做“鳳凰科技”。
Mozilla瀑布汗,改名叫Firebird(火鳥)!還不行麼?
我們得原諒一下他們的取名,雖然現在看來滿滿的山寨感,可放在那個時代,Firebird這名字很炫酷。就像你當初的QQ暱稱叫赤炎天使感覺依然良好一樣。
但是,他們發現,業內有個資料庫系統,也叫的Firebird…淚流滿面的Mozilla感慨重生好難呀。最後才決定叫Firefox(火狐)。
基於Gecko引擎的Firefox非常優秀,為了告訴大家,我使用了這個引擎,它標誌自己的UserAgent為Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
。
這時候的UserAgent,雖然長了點,但它並不混亂,準確的標明瞭系統,排版引擎,瀏覽器名稱等資訊。雖然IE這時已經佔有了很大的市場份額,但基本停步不前;而Mozilla經過一段時間的修生養息,Firefox在業內廣受好評,得到了快速的發展。
時值2003年,web2.0的浪潮前夕,瀏覽器的發展達到了空前的盛世。
然而所謂否極泰來,盛極則衰。涅槃的Firefox迎來盛世,卻又恰恰由於盛世,決定了UserAgent糾結的命運。
六、師夷長技
前面說到,微軟靠Windows系統捆綁IE銷售。而Windows自然也有它的對手,Linux。一個技術快速發展的時代,系統的世界裡也是戰火紛飛。Linux系統自從有了視覺化介面,也需要瀏覽器呀。桌面系統KDE的締造者們就發明了一個。
真是具有跨時代意義的工具呀,好偉大呀,人們在想,它叫什麼呢?
但大神就是大神,大神就是講究先從文字上佔據壓垮你的氣勢。
先有Navigator航海家,再有Explorer探索者,我們就叫Konqueror(Conqueror的變體)征服者吧。
行行行。我已懶得理這幫大神…
可是,問題來了。Konqueror使用KHTML排版引擎,即使它們認為自己跟Gecko引擎一樣優秀,但使用者不買單。你UserAgent裡沒有“Gecko”字樣,我就不給你經過優良排版的html。
結果,Konqueror思來想去,做了一個艱難但很萌的決定,把UserAgent寫成Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)
…
這就是現代瀏覽器裡like Gecko
這一萌詞的由來。
就這樣,偉大的排版引擎KHTML為了獲得更好的資源,師夷長技。這並沒什麼不好,卻造成了UserAgent的越發混亂。
KHTML與Gecko這一對,永遠卿卿我我比翼雙飛在UserAgent裡面了。那個滿含深意的“like”,有人覺得翻譯成“像”,但也有人覺得應該是“喜歡”…
七、世界大戰
首先是IE冷靜下來了,他覺得,你們不帶這麼玩的?
就我年少時不懂事,首先改了個Mozilla字樣,後面追究這歷史我豈不是成了罪魁禍首?我改還不行嗎?
在IE6,它明確自己UserAgent為Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
。除去已經註定不可抹去的“Mozilla”字樣,其餘資訊簡潔,準確,清晰。
但事態已經不可收拾。
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)
三個選擇項。第一個是易容成IE,第二個是易容成火狐,第三個才是自己,選誰就是誰!
其實這並不是一件壞事。因為Opera是站在能夠讓使用者通過選擇,去獲得更好的瀏覽體驗的基礎上的。你提供選擇,或是不提供,混亂的UserAgent還是在這,不離,不棄。再者,這對網頁的開發者有極大的好處,在某些情況,你不必同時開啟幾個不同的瀏覽器去除錯。到目前,最新的Chrome瀏覽器更加炫酷,能夠支援近40種不同的UserAgent,甚至你還可以自定義。當然這是後話。
與此同時,蘋果公司依靠核心WebKit,開發出Safari,命名UserAgent為Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5
。
有人就會問了,不是Webkit核心嗎,怎麼還有KHTML, like Gecko
?注意,核心Webkit包含了一個排版引擎叫WebCore,而WebCore是KHTML衍生而來的。也就是說,WebCore是KHTML的兒子,子承父業,基因差不多。為了能夠正常排版,safari只能這麼寫。
後來,google也開發了自己的瀏覽器Chrome,其核心也是Webkit,但它設定UserAgent為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
。Safari一看,不對勁啊!你怎麼也在後面寫有Safari?Chrome呵呵一笑,你懂的。
因此,請讓我一口氣說完下面這一段:
Chrome希望能得到為Safari編寫的網頁,於是決定裝成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又偽裝自己是KHTML,KHTML呢又是偽裝成Gecko的。同時所有的瀏覽器又都宣稱自己是Mozilla。
這就是整個UserAgent世界大戰的格局…
八、軍閥混戰
將目光聚焦到國內,更是狼煙四起,混亂不堪。大家都知道,瀏覽器是網際網路的入口,這塊肥肉誰也不想丟。因而一個接一個的“國產”瀏覽器進入鬥獸場。
360,百度,QQ,UC,搜狗,獵豹,遨遊,世界之窗…你能說出一大堆。連淘寶,酷狗,hao123都有瀏覽器,不信你搜。
注意我前面“國產”兩個字必須加上雙引號,因為這個made in china並不純。國人並沒能像遠古大神一樣,硬生生發明一個核心出來,我們更擅長“微創新”。
利用Trident(IE的核心),包裝一下皮膚,美化一下,就可以說:完美相容
利用Webkit,包裝一下皮膚,美化一下,就可以說:極速瀏覽
把兩個核心都包起來,就可以說:智慧雙核
是微創新!讀書人的事,能叫偷嗎?
在這插播一下,瀏覽器的“雙核”,並不是你聽說手機雙核電腦雙核那回事。再多個核,速度也不會更快,當然這麼說,會顯得很厲害的樣子。德藝雙馨,智勇雙全,名利雙收,才貌雙絕,夫妻雙雙把家還,你看帶“雙”字的詞都很牛的。
但我上面的敘述,的確有誇張的成分。瀏覽器的誕生,肯定不僅僅是包一下皮膚那麼簡單,國內的工程師們,也苦心研究做了許多工作。如果要說優化策略,我可以再寫一篇超級長的文章。優化無止境,路漫漫其修遠,向同行們致敬。只是我非常討厭那些不把事實說清楚,純粹靠文案去忽悠人的產品…
話說回來,這麼多國產瀏覽器,總得靠不同UserAgent標誌自己呀。
大家自動分為兩個陣營:使用Trident核心的,在IE已有UserAgent後新增自己的名稱;使用Webkit核心的,就在Chrome的UserAgent後面新增。
前者像QQ瀏覽器:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.7.26717.400)
。
後者像獵豹:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER
。
當然雙核瀏覽器誠然就是牆頭草,切換核心時UserAgent也需要跟著變化。
如此的混戰格局,這廂的IE和Chome想必也是醉了。
九、國共內戰
適者生存是不變的生存法則,國產瀏覽器們經過一段時間的使用者篩選,自然優勝劣汰。時值2010年,真正還在運營和更新的瀏覽器數量慢慢下降,使用者集中在幾家表現更優異的廠商手中。就在這時,好看的故事來了——3Q大戰爆發。
有人說,騰訊電腦管家的推出是導火索。其實這場仗,大家都忍了好久,推不推出,都一定會在某個事件後爆發。360瀏覽器是奇虎的重量級產品,使用者量眾多,2009年它推出一個功能:過濾其它網站的廣告。誠然民眾們都很喜歡。可是其他網際網路公司肯定就不樂意了,使用者看不到更點選不到廣告,這錢還怎麼賺?
因而在3Q大戰爆發後,騰訊的一個手段就是:如果你使用360瀏覽器,就不能訪問QQ的網站(單單QQ空間就有巨大的使用者量),也直接反攻360的最大收入來源。一個艱難的決定背後,往往是需要無數種的技術戰略支撐的。企鵝判斷使用者是否使用360瀏覽器,依靠的就是UserAgent裡是否有“360SE”的字樣。
戰報傳來:號外,360瀏覽器上不了QQ空間!已經買了黃鑽的殺馬特貴族急了呀!只能換瀏覽器了呀!感覺侢乜卟噲噯嘞呀!
2011年11月3日,騰訊網站封殺360瀏覽器
2011年11月4日,360瀏覽器訪問量僅為昨日一半
2011年11月5日,360瀏覽器訪問量幾乎為0
有人說,騰訊就這麼快贏了?恰恰相反,360瀏覽器通過一次強制的自動升級,又可以訪問QQ的網站了。360的工程師們在5日使用了偽裝術——把“360SE”字樣從UserAgent中去掉!
意思就是,360瀏覽器的UserAgent跟IE完全一樣,你根本判斷不出來(因而訪問量為0)。就怕流氓有文化!企鵝傻眼了,總不能把大微軟的IE也一併給禁了吧…
這場土匪遇惡霸的耍流氓大戰,最終通過法律而化解。企鵝在技術側拿360沒辦法,而360則得到了一個跟IE一樣的身份證。在這場內戰中,受傷的除了廣大網民們,其實還有令人心疼UserAgent君,以往讓它越長越長就算了,這次長了還得閹割掉,真心dan疼呀。
十、明日邊緣
看到這裡,大家會明白一個道理:如果未來不出現一款霸主級別的瀏覽器(或核心),UserAgent應該不會有大變化了。
不過,這道理並不全對。別忘了,移動側也是有瀏覽器的。
在早期能上網的手機裡,內建了各手機廠商自研的瀏覽器。這些瀏覽器並不需要像PC一樣的複雜設計,可以訪問wap網頁就足夠了。因而它們的UserAgent命名,怎麼簡單怎麼來,就直接叫諾基亞 3100 Nokia3100/06.01 (UCWEB 3.3B)
,PHILIPS755 ObigoInternetBrowser/2.0
這樣,有甚者連瀏覽器叫什麼都不帶 TCL-3199
,三星 E618 SEC-SGHE618
。
這樣任由發展下去,一種要歷史重演,往日重現的即視感壓迫而來。
web世界的聯合國——W3C組織,站在明日邊緣,面對著歷史和未來,終於發話,它制定UserAgent標準,以後都得按這規範去起名字。詳細請閱User Agent Accessibility Guidelines。至此,命運坎坷的UserAgent終於逐步走向規範。W3C大法好,有人說你怎麼不早點來拯救世界呀!其實W3C一直在努力,但規範的制定,到推廣至大家認可並執行,是一條漫長的道路,需要時間,也需要實踐。
W3C組織,在制定web標準這件工作之外,再我看來,還有兩個身份:1、和事佬;2、背黑鍋。和事不成,就得背黑鍋。是的就是這樣。
彩蛋
那麼,我們的故事接近尾聲。還有一些有趣的小彩蛋。
- Chome 28開始,與蘋果正式分道揚鑣,採用Blink核心,但它的UserAgent並不改變。
- 淘寶封殺微信開啟淘寶頁面,靠的就是微信內建瀏覽器UserAgent裡的MicroMessenger字樣。其實微信也可以像當初360一樣把UserAgent去掉,但微信並不這樣做。
- 360出招之時留有後招。也許,它一開始就想到了騰訊會告他們對於UserAgent的欺瞞,因而它其實提供了設定項。預設設定是“保持跟IE一樣的UserAgent”,但使用者也可以不勾選。只是這選項比較隱蔽,而且你重啟瀏覽器後…又會變回預設設定。如果沒有這個小小的設定,結果大家可以自行想象。
- 微軟又玩新花樣了,在IE11中,去掉了以往的MSIE字樣。初步猜測此舉是為了使現有的 CSS hack 失效,避免過去網頁設計師對IE差別對待的情況再度發生。但又會引發其他問題啊親。
相關文章
- Python爬蟲教程-10-UserAgent和常見瀏覽器UA值Python爬蟲瀏覽器
- SSH三大框架使用谷歌瀏覽器上傳檔案瀏覽器崩潰框架谷歌瀏覽器
- 【瀏覽器】瀏覽器基本工作原理瀏覽器
- Chrome 瀏覽器修改 UA 模擬其它瀏覽器,包括移動瀏覽器Chrome瀏覽器
- 瀏覽器瀏覽器
- Min瀏覽器: 更快更輕量瀏覽器瀏覽器
- 基石-初見瀏覽器(一):瀏覽器渲染瀏覽器
- chrome 瀏覽器位址列快速搜尋設定Chrome瀏覽器
- microsoft edge是ie瀏覽器嗎 edge瀏覽器和ie瀏覽器一樣嗎ROS瀏覽器
- 前端面試瀏覽器系列:瀏覽器快取前端面試瀏覽器快取
- “木偶”瀏覽器瀏覽器
- 瀏覽器核心瀏覽器
- 瀏覽器原理瀏覽器
- 瀏覽器渲染瀏覽器
- [瀏覽器]LocalStorage瀏覽器
- js 在瀏覽器中的event loop事件佇列JS瀏覽器OOP事件佇列
- Ubuntu 秘笈之命令列下管理瀏覽器書籤Ubuntu命令列瀏覽器
- Java上傳檔案到遠端伺服器和瀏覽器預覽圖片Java伺服器瀏覽器
- 判斷當前瀏覽器是不是微信瀏覽器瀏覽器
- 使用chrome瀏覽器驅動自動開啟瀏覽器Chrome瀏覽器
- Edge瀏覽器被搜狗瀏覽器篡改的解決方法瀏覽器
- [BUG反饋]IE瀏覽器,百度瀏覽器,搜狗瀏覽器批量操作功能都不相容!!!!傲遊、火狐、谷歌瀏覽器可以瀏覽器谷歌
- emoji在瀏覽器中是如何傳遞給伺服器的瀏覽器伺服器
- MacOS下chrome瀏覽器上傳jpg證件照無法上傳MacChrome瀏覽器
- 瀏覽器快取瀏覽器快取
- IE瀏覽器相容瀏覽器
- 瀏覽器沙箱模型瀏覽器模型
- 使用瀏覽器事件瀏覽器事件
- 9:瀏覽器相容瀏覽器
- 瀏覽器跨域瀏覽器跨域
- 瀏覽器渲染原理瀏覽器
- 瀏覽器安全(一)瀏覽器
- 瀏覽器事件解析瀏覽器事件
- 瀏覽器滑鼠事件瀏覽器事件
- 瀏覽器渲染引擎瀏覽器
- 【瀏覽器】聊聊DOM瀏覽器
- 瀏覽器全屏API瀏覽器API
- 瀏覽器渲染流程瀏覽器
- js上傳圖片預覽,相容IE6以上各大主流瀏覽器JS瀏覽器