作者:Litten 某天,我做一個(gè)小項(xiàng)目,需要判斷一下瀏覽器類型。簡單的呀。 控制臺(tái)敲下:navigator.userAgent 瀏覽器回應(yīng):Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 天,這串是啥?你怎么連話都說不清楚? 我對(duì)userAgent并不陌生,但明明一個(gè)單詞就可以說清楚的事情,卻是這么掏心掏肺的回答。怪可憐的,一定有冤情。 后來我查閱了很多資料,發(fā)現(xiàn)歷史非常的精彩。 大事年表 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發(fā)明了WorldWideWeb,即萬維網(wǎng)。同時(shí),李大神也發(fā)明了第一款瀏覽器。真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙?,叫什么好呢?/p> 但大神就是大神,大神內(nèi)心的想法又豈是爾等凡人能夠肆意揣摩? 萬萬沒想到,李大神說,我這瀏覽器,也叫WorldWideWeb!不行么? 行行行。 雖然李大神起名字這么拽,但他后來發(fā)覺,還是得賦予一點(diǎn)承上啟下的歷史意義,就改名成“Nexus”。值得注意的是,這瀏覽器,居然是可以兼容Unix跟Microsoft DOS的。它在當(dāng)時(shí)流行的各種電腦上跑得飛起,應(yīng)用也越來越廣,被稱為“殺手級(jí)應(yīng)用”。殺手級(jí)…你們看互聯(lián)網(wǎng)一開始就是這么的腥風(fēng)血雨。 但這個(gè)瀏覽器,還不支持圖片的顯示,這是出現(xiàn)UserAgent的導(dǎo)火索。 二、唐堯虞舜 93年,伊利諾大學(xué)的NCSA組織認(rèn)為,瀏覽器無圖無真相,這不好。因而他們發(fā)明了第一款可顯示圖片的瀏覽器。 真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙?,叫什么好呢?/p> 但大神就是大神,大神就是連起名字都讓你驚心動(dòng)魄。 NCSA組織說,它能顯示圖片,偏偏我們就要叫它“馬賽克(Mosaic)”!不行么? 行行行。 但有人就問了,Nexus不顯示圖片,Mosaic能顯示,你們讓html提供者怎么寫代碼?你們是不是想逼死選擇困難癥患者?有沒有考慮過天秤座的感受? 因而UserAgent就誕生了。Mosaic將自己標(biāo)志為NCSA_Mosaic/2.0 (Windows 3.1),大家該怎么寫代碼就怎么寫,但請(qǐng)求會(huì)帶上這個(gè)信息,服務(wù)器就知道該不該返回能顯示圖片的html。UserAgent君,出生時(shí)跟我們?cè)O(shè)想的一樣簡單,僅僅標(biāo)明了自己是什么瀏覽器,在什么系統(tǒng)運(yùn)行,以及各自的版本號(hào)。 新舊瀏覽器們像彬彬有禮的君王,商議和讓位是為了更好的繁榮。但風(fēng)雨欲來。 三、楚漢爭霸 像劉邦一樣,走出來一個(gè)攪局的小流氓。當(dāng)然他還是很有志向的,他的目標(biāo),就是戰(zhàn)勝霸主Mosaic。后來,他還真的做到了。 如今,所有現(xiàn)代瀏覽器的UserAgent里都有它的標(biāo)志,就像漢朝之后,我們都稱為“漢”人。一群很有天賦的程序員,一起締造了它的輝煌。 真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙耄惺裁茨兀?/p> 但大神就是大神,大神就是讓你永遠(yuǎn)也猜不到他們想了個(gè)什么名字。 大神們說,叫Mozilla,不行么? 行。但什么意思呢? 含義有二。其一,哥斯拉(Godzilla)諧音,誠然是一頭野心勃勃的怪獸;其二,”Mosaic Killa”之意,Killa是俚語中Killer的拼法,即“馬賽克的終結(jié)者”,赤裸裸的挑戰(zhàn)。 驚呆了的Mosaic小心翼翼的念著Mozilla這發(fā)音:“Mo…摸咋了?”勃然大怒,“摸你妹!” 鑒于Mosaic當(dāng)時(shí)的權(quán)勢(shì),Mozilla改名成Netscape Navigator(網(wǎng)景航海家)。小怪獸突然變成有點(diǎn)文藝小清新的名字,郁悶得很,但內(nèi)心的血液沸騰著。雖然叫大名叫網(wǎng)景,但它把UserAgent偷偷設(shè)置成Mozilla/1.0 (Win3.1)。還是摸咋了?咬我? 四、宋元之戰(zhàn) 很快,NetScape戰(zhàn)勝了Mosaic,成為了新的霸主,因?yàn)槠涓鼉?yōu)的展示。 NetScape最先支持了html框架顯示,就是簡單的table布局,內(nèi)外邊距之類,僅僅這點(diǎn)就將Mosaic拋諸身后。區(qū)別這兩個(gè)瀏覽器,還是用的UserAgent。如果是UserAgent里含有“Mozilla”字樣,那就發(fā)送支持框架的頁面,否則,就發(fā)送不含框架的頁面。 NetScape帝國日益龐大,歌舞升平,一切風(fēng)平浪靜,直到微軟的鐵騎揮軍南下。 微軟發(fā)布了一款跟系統(tǒng)強(qiáng)綁定的瀏覽器,真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙?,它叫什么呢?/p> 不用想了,就是IE。這命名也相當(dāng)簡單粗暴,Internet Explorer,直接把這工具的用途拍在你臉上。連說明書都可以免了。 IE也是支持html標(biāo)準(zhǔn)框架的,但由于前面的歷史原因,人們只會(huì)給UserAgent里含有“Mozilla”字樣的瀏覽器發(fā)送含框架的頁面。但這點(diǎn)小事能難倒我大微軟?IE呵呵一笑,把自己的UserAgent改成Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)。看,我這里也有“Mozilla”字樣,也能收到含框架的頁面了! 當(dāng)然,這個(gè)小流氓行為,跟后來把IE和Windows捆綁一起銷售的大流氓行為比起來,根本不為足道。后面的故事我們也知道了,IE把NetScape干掉了。但它的身體上,卻永遠(yuǎn)的烙上了“Mozilla”的印記。 五、康乾盛世 看過奧特曼的都知道,怪獸被打敗了會(huì)再回來。別忘了NetScape曾擁有一批大神們,失敗后,他們圍繞著瀏覽器排版引擎Gecko(壁虎)成立了非正式組織Mozilla。小怪獸再次出發(fā)。大神們發(fā)明了另一款優(yōu)秀的瀏覽器,它在插件拓展和開發(fā)調(diào)試領(lǐng)域做出的貢獻(xiàn),絕對(duì)可以載入互聯(lián)網(wǎng)歷史。 真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙?,它叫什么呢?/p> 但大神就是大神,大神就是即使你知道了Mozilla的命名都是野獸,卻還是猜不到是什么。 Mozilla說,我們?cè)』鹬厣?,叫Phoenix(鳳凰)!不行么? 真不行。 剛推出就被人告了,原來已經(jīng)有一家公司叫做“鳳凰科技”。 Mozilla瀑布汗,改名叫Firebird(火鳥)!還不行么? 我們得原諒一下他們的取名,雖然現(xiàn)在看來滿滿的山寨感,可放在那個(gè)時(shí)代,F(xiàn)irebird這名字很炫酷。就像你當(dāng)初的QQ昵稱叫赤炎天使感覺依然良好一樣。 但是,他們發(fā)現(xiàn),業(yè)內(nèi)有個(gè)數(shù)據(jù)庫系統(tǒng),也叫的Firebird…淚流滿面的Mozilla感慨重生好難呀。最后才決定叫Firefox(火狐)。 基于Gecko引擎的Firefox非常優(yōu)秀,為了告訴大家,我使用了這個(gè)引擎,它標(biāo)志自己的UserAgent為Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0。 這時(shí)候的UserAgent,雖然長了點(diǎn),但它并不混亂,準(zhǔn)確的標(biāo)明了系統(tǒng),排版引擎,瀏覽器名稱等信息。雖然IE這時(shí)已經(jīng)占有了很大的市場份額,但基本停步不前;而Mozilla經(jīng)過一段時(shí)間的修生養(yǎng)息,F(xiàn)irefox在業(yè)內(nèi)廣受好評(píng),得到了快速的發(fā)展。 時(shí)值2003年,web2.0的浪潮前夕,瀏覽器的發(fā)展達(dá)到了空前的盛世。 然而所謂否極泰來,盛極則衰。涅槃的Firefox迎來盛世,卻又恰恰由于盛世,決定了UserAgent糾結(jié)的命運(yùn)。 六、師夷長技 前面說到,微軟靠Windows系統(tǒng)捆綁IE銷售。而Windows自然也有它的對(duì)手,Linux。一個(gè)技術(shù)快速發(fā)展的時(shí)代,系統(tǒng)的世界里也是戰(zhàn)火紛飛。Linux系統(tǒng)自從有了可視化界面,也需要瀏覽器呀。桌面系統(tǒng)KDE的締造者們就發(fā)明了一個(gè)。 真是具有跨時(shí)代意義的工具呀,好偉大呀,人們?cè)谙?,它叫什么呢?/p> 但大神就是大神,大神就是講究先從文字上占據(jù)壓垮你的氣勢(shì)。 先有Navigator航海家,再有Explorer探索者,咱就叫Konqueror(Conqueror的變體)征服者吧。 行行行。我已懶得理這幫大神… 可是,問題來了。Konqueror使用KHTML排版引擎,即使它們認(rèn)為自己跟Gecko引擎一樣優(yōu)秀,但用戶不買單。你UserAgent里沒有“Gecko”字樣,我就不給你經(jīng)過優(yōu)良排版的html。 結(jié)果,Konqueror思來想去,做了一個(gè)艱難但很萌的決定,把UserAgent寫成Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)… 這就是現(xiàn)代瀏覽器里like Gecko這一萌詞的由來。 就這樣,偉大的排版引擎KHTML為了獲得更好的資源,師夷長技。這并沒什么不好,卻造成了UserAgent的越發(fā)混亂。 KHTML與Gecko這一對(duì),永遠(yuǎn)卿卿我我比翼雙飛在UserAgent里面了。那個(gè)滿含深意的“l(fā)ike”,有人覺得翻譯成“像”,但也有人覺得應(yīng)該是“喜歡”… 七、世界大戰(zhàn) 首先是IE冷靜下來了,他覺得,你們不帶這么玩的? 就我年少時(shí)不懂事,首先改了個(gè)Mozilla字樣,后面追究這歷史我豈不是成了罪魁禍?zhǔn)祝课腋倪€不行嗎? 在IE6,它明確自己UserAgent為Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)。除去已經(jīng)注定不可抹去的“Mozilla”字樣,其余信息簡潔,準(zhǔn)確,清晰。 但事態(tài)已經(jīng)不可收拾。 Opera給這狂躁的世界添了一把火。它覺得,易容術(shù)非常炫酷呀。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)三個(gè)選擇項(xiàng)。第一個(gè)是易容成IE,第二個(gè)是易容成火狐,第三個(gè)才是自己,選誰就是誰! 其實(shí)這并不是一件壞事。因?yàn)镺pera是站在能夠讓用戶通過選擇,去獲得更好的瀏覽體驗(yàn)的基礎(chǔ)上的。你提供選擇,或是不提供,混亂的UserAgent還是在這,不離,不棄。再者,這對(duì)網(wǎng)頁的開發(fā)者有極大的好處,在某些情況,你不必同時(shí)打開幾個(gè)不同的瀏覽器去調(diào)試。到目前,最新的Chrome瀏覽器更加炫酷,能夠支持近40種不同的UserAgent,甚至你還可以自定義。當(dāng)然這是后話。 與此同時(shí),蘋果公司依靠內(nèi)核WebKit,開發(fā)出Safari,命名UserAgent為Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5。 有人就會(huì)問了,不是Webkit內(nèi)核嗎,怎么還有KHTML, like Gecko?注意,內(nèi)核Webkit包含了一個(gè)排版引擎叫WebCore,而WebCore是KHTML衍生而來的。也就是說,WebCore是KHTML的兒子,子承父業(yè),基因差不多。為了能夠正常排版,safari只能這么寫。 后來,google也開發(fā)了自己的瀏覽器Chrome,其內(nèi)核也是Webkit,但它設(shè)定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一看,不對(duì)勁??!你怎么也在后面寫有Safari?Chrome呵呵一笑,你懂的。 因此,請(qǐng)讓我一口氣說完下面這一段: Chrome希望能得到為Safari編寫的網(wǎng)頁,于是決定裝成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又偽裝自己是KHTML,KHTML呢又是偽裝成Gecko的。同時(shí)所有的瀏覽器又都宣稱自己是Mozilla。 這就是整個(gè)UserAgent世界大戰(zhàn)的格局… 八、軍閥混戰(zhàn) 將目光聚焦到國內(nèi),更是狼煙四起,混亂不堪。大家都知道,瀏覽器是互聯(lián)網(wǎng)的入口,這塊肥肉誰也不想丟。因而一個(gè)接一個(gè)的“國產(chǎn)”瀏覽器進(jìn)入斗獸場。 360,百度,QQ,UC,搜狗,獵豹,遨游,世界之窗…你能說出一大堆。連淘寶,酷狗,hao123都有瀏覽器,不信你搜。 注意我前面“國產(chǎn)”兩個(gè)字必須加上雙引號(hào),因?yàn)檫@個(gè)made in china并不純。國人并沒能像遠(yuǎn)古大神一樣,硬生生發(fā)明一個(gè)內(nèi)核出來,我們更擅長“微創(chuàng)新”。 利用Trident(IE的內(nèi)核),包裝一下皮膚,美化一下,就可以說:完美兼容 利用Webkit,包裝一下皮膚,美化一下,就可以說:極速瀏覽 把兩個(gè)內(nèi)核都包起來,就可以說:智能雙核 是微創(chuàng)新!讀書人的事,能叫偷嗎? 在這插播一下,瀏覽器的“雙核”,并不是你聽說手機(jī)雙核電腦雙核那回事。再多個(gè)核,速度也不會(huì)更快,當(dāng)然這么說,會(huì)顯得很厲害的樣子。德藝雙馨,智勇雙全,名利雙收,才貌雙絕,夫妻雙雙把家還,你看帶“雙”字的詞都很牛的。 但我上面的敘述,的確有夸張的成分。瀏覽器的誕生,肯定不僅僅是包一下皮膚那么簡單,國內(nèi)的工程師們,也苦心研究做了許多工作。如果要說優(yōu)化策略,我可以再寫一篇超級(jí)長的文章。優(yōu)化無止境,路漫漫其修遠(yuǎn),向同行們致敬。只是我非常討厭那些不把事實(shí)說清楚,純粹靠文案去忽悠人的產(chǎn)品… 話說回來,這么多國產(chǎn)瀏覽器,總得靠不同UserAgent標(biāo)志自己呀。 大家自動(dòng)分為兩個(gè)陣營:使用Trident內(nèi)核的,在IE已有UserAgent后添加自己的名稱;使用Webkit內(nèi)核的,就在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。 當(dāng)然雙核瀏覽器誠然就是墻頭草,切換內(nèi)核時(shí)UserAgent也需要跟著變化。 如此的混戰(zhàn)格局,這廂的IE和Chome想必也是醉了。 九、國共內(nèi)戰(zhàn) 適者生存是不變的生存法則,國產(chǎn)瀏覽器們經(jīng)過一段時(shí)間的用戶篩選,自然優(yōu)勝劣汰。時(shí)值2010年,真正還在運(yùn)營和更新的瀏覽器數(shù)量慢慢下降,用戶集中在幾家表現(xiàn)更優(yōu)異的廠商手中。就在這時(shí),好看的故事來了——3Q大戰(zhàn)爆發(fā)。 有人說,騰訊電腦管家的推出是導(dǎo)火索。其實(shí)這場仗,大家都忍了好久,推不推出,都一定會(huì)在某個(gè)事件后爆發(fā)。360瀏覽器是奇虎的重量級(jí)產(chǎn)品,用戶量眾多,2009年它推出一個(gè)功能:過濾其它網(wǎng)站的廣告。誠然民眾們都很喜歡。可是其他互聯(lián)網(wǎng)公司肯定就不樂意了,用戶看不到更點(diǎn)擊不到廣告,這錢還怎么賺? 因而在3Q大戰(zhàn)爆發(fā)后,騰訊的一個(gè)手段就是:如果你使用360瀏覽器,就不能訪問QQ的網(wǎng)站(單單QQ空間就有巨大的用戶量),也直接反攻360的最大收入來源。一個(gè)艱難的決定背后,往往是需要無數(shù)種的技術(shù)戰(zhàn)略支撐的。企鵝判斷用戶是否使用360瀏覽器,依靠的就是UserAgent里是否有“360SE”的字樣。 戰(zhàn)報(bào)傳來:號(hào)外,360瀏覽器上不了QQ空間!已經(jīng)買了黃鉆的殺馬特貴族急了呀!只能換瀏覽器了呀!感覺侢乜卟噲噯嘞呀! 2011年11月3日,騰訊網(wǎng)站封殺360瀏覽器 2011年11月4日,360瀏覽器訪問量僅為昨日一半 2011年11月5日,360瀏覽器訪問量幾乎為0 有人說,騰訊就這么快贏了?恰恰相反,360瀏覽器通過一次強(qiáng)制的自動(dòng)升級(jí),又可以訪問QQ的網(wǎng)站了。360的工程師們?cè)?日使用了偽裝術(shù)——把“360SE”字樣從UserAgent中去掉! 意思就是,360瀏覽器的UserAgent跟IE完全一樣,你根本判斷不出來(因而訪問量為0)。就怕流氓有文化!企鵝傻眼了,總不能把大微軟的IE也一并給禁了吧… 這場土匪遇惡霸的耍流氓大戰(zhàn),最終通過法律而化解。企鵝在技術(shù)側(cè)拿360沒辦法,而360則得到了一個(gè)跟IE一樣的身份證。在這場內(nèi)戰(zhàn)中,受傷的除了廣大網(wǎng)民們,其實(shí)還有令人心疼UserAgent君,以往讓它越長越長就算了,這次長了還得閹割掉,真心dan疼呀。 十、明日邊緣 看到這里,大家會(huì)明白一個(gè)道理:如果未來不出現(xiàn)一款霸主級(jí)別的瀏覽器(或內(nèi)核),UserAgent應(yīng)該不會(huì)有大變化了。 不過,這道理并不全對(duì)。別忘了,移動(dòng)側(cè)也是有瀏覽器的。 在早期能上網(wǎng)的手機(jī)里,內(nèi)置了各手機(jī)廠商自研的瀏覽器。這些瀏覽器并不需要像PC一樣的復(fù)雜設(shè)計(jì),可以訪問wap網(wǎng)頁就足夠了。因而它們的UserAgent命名,怎么簡單怎么來,就直接叫諾基亞 3100 Nokia3100/06.01 (UCWEB 3.3B),PHILIPS755 ObigoInternetBrowser/2.0這樣,有甚者連瀏覽器叫什么都不帶TCL-3199,三星 E618 SEC-SGHE618。 這樣任由發(fā)展下去,一種要?dú)v史重演,往日重現(xiàn)的即視感壓迫而來。 web世界的聯(lián)合國——W3C組織,站在明日邊緣,面對(duì)著歷史和未來,終于發(fā)話,它制定UserAgent標(biāo)準(zhǔn),以后都得按這規(guī)范去起名字。詳細(xì)請(qǐng)閱User Agent Accessibility Guidelines。至此,命運(yùn)坎坷的UserAgent終于逐步走向規(guī)范。W3C大法好,有人說你怎么不早點(diǎn)來拯救世界呀!其實(shí)W3C一直在努力,但規(guī)范的制定,到推廣至大家認(rèn)可并執(zhí)行,是一條漫長的道路,需要時(shí)間,也需要實(shí)踐。 W3C組織,在制定web標(biāo)準(zhǔn)這件工作之外,再我看來,還有兩個(gè)身份:1、和事佬;2、背黑鍋。和事不成,就得背黑鍋。是的就是這樣。 彩蛋 那么,我們的故事接近尾聲。還有一些有趣的小彩蛋。 Chome 28開始,與蘋果正式分道揚(yáng)鑣,采用Blink內(nèi)核,但它的UserAgent并不改變。 淘寶封殺微信打開淘寶頁面,靠的就是微信內(nèi)置瀏覽器UserAgent里的MicroMessenger字樣。其實(shí)微信也可以像當(dāng)初360一樣把UserAgent去掉,但微信并不這樣做。 360出招之時(shí)留有后招。也許,它一開始就想到了騰訊會(huì)告他們對(duì)于UserAgent的欺瞞,因而它其實(shí)提供了設(shè)置項(xiàng)。默認(rèn)設(shè)置是“保持跟IE一樣的UserAgent”,但用戶也可以不勾選。只是這選項(xiàng)比較隱蔽,而且你重啟瀏覽器后…又會(huì)變回默認(rèn)設(shè)置。如果沒有這個(gè)小小的設(shè)置,結(jié)果大家可以自行想象。 微軟又玩新花樣了,在泄露版IE 11中,去掉了以往的MSIE字樣。初步猜測此舉是為了使現(xiàn)有的 CSS hack 失效,避免過去網(wǎng)頁設(shè)計(jì)師對(duì)IE差別對(duì)待的情況再度發(fā)生。但又會(huì)引發(fā)其他問題啊親。 |
|