?
This document uses PHP Chinese website manual Release
向不同的瀏覽器提供不同的網(wǎng)頁或服務(wù)通常是一個壞主意。無論用戶使用哪種瀏覽器或設(shè)備,Web都應(yīng)該可供所有人訪問。有很多方法可以根據(jù)功能的可用性而不是針對特定的瀏覽器來開發(fā)自己的網(wǎng)站以逐步提升自身。
但瀏覽器和標(biāo)準(zhǔn)并不完美,并且仍然存在一些需要檢測瀏覽器的邊緣情況。使用用戶代理來檢測瀏覽器看起來很簡單,但做得很好實(shí)際上是一個非常困難的問題。本文件將指導(dǎo)您盡可能正確地做到這一點(diǎn)。
這值得重新思考:使用用戶代理嗅探非常不好。您幾乎總能找到更好,更廣泛兼容的方式來解決您的問題!
當(dāng)考慮使用用戶代理字符串來檢測正在使用的瀏覽器時,如果可能的話,您的第一步是盡量避免它。首先嘗試確定你為什么要這樣做。
你是否試圖在某個版本的瀏覽器中解決特定的錯誤?在專門的論壇中查看或詢問:你不可能成為第一個遇到這個問題的人。另外,專家或者僅僅是擁有另一種觀點(diǎn)的人,可以為您提供解決錯誤的方法。如果這個問題看起來并不常見,那么值得檢查這個bug是否已經(jīng)通過他們的bug跟蹤系統(tǒng)(Mozilla ; WebKit ; Opera)。瀏覽器制造商確實(shí)注意到錯誤報告,分析可能會暗示其他錯誤的解決方法。您是否試圖檢查是否存在特定功能?您的網(wǎng)站需要使用某些瀏覽器不具備的特定Web功能,還沒有支持,你想發(fā)送這些用戶到一個功能較少的舊網(wǎng)站,但你知道會工作。這是使用用戶代理檢測的最壞原因,因?yàn)樽罱K所有其他瀏覽器都會迎頭趕上。你應(yīng)該盡量避免在這種情況下使用用戶代理嗅探,而是做功能檢測。是否要根據(jù)使用哪種瀏覽器提供不同的HTML?這通常是一種不好的做法,但在某些情況下這是必要的。在這些情況下,你應(yīng)該首先分析你的情況,確保它確實(shí)是必要的。<div>
或<span>
元素?成功使用用戶代理檢測的困難值得對HTML的純度造成一些干擾。此外,重新考慮您的設(shè)計:您可以使用漸進(jìn)增強(qiáng)或流體布局來幫助消除這種需求嗎?
如果您想盡量避免使用用戶代理檢測,則在某些情況下有選項!
功能檢測功能檢測是您不試圖找出哪個瀏覽器正在呈現(xiàn)您的頁面的位置,而是檢查您需要的特定功能是否可用。如果不是,則使用后備。但是,在極少數(shù)情況下,如果實(shí)際上需要瀏覽器檢測,請不要使用功能檢測,因?yàn)槠渌麨g覽器將來可能會實(shí)現(xiàn)此功能,但方式不同。由此造成的錯誤可能難以找到并修復(fù)。進(jìn)度增強(qiáng)此設(shè)計技術(shù)涉及使用自下而上的方法在“圖層”中開發(fā)您的網(wǎng)站,從更簡單的圖層開始,并在連續(xù)圖層中提高網(wǎng)站的功能,每個使用更多features.Graceful降級這是一種自上而下的方法,您可以使用所需的所有功能構(gòu)建盡可能好的站點(diǎn),然后調(diào)整它,使其在舊版瀏覽器上工作。這可能比漸進(jìn)式增強(qiáng)更難,效果也更差,但在某些情況下可能會有用。
由于用戶代理字符串的不同部分沒有統(tǒng)一性,這是棘手的部分。
當(dāng)人們說他們想要“瀏覽器檢測”時,通常他們實(shí)際上想要“渲染引擎檢測”。您是否真的想檢測Firefox,而不是SeaMonkey或Chrome,而不是Chromium?或者你真的只想看看瀏覽器是使用Gecko還是WebKit渲染引擎?如果這是您需要的,請參閱頁面的更下方。
大多數(shù)瀏覽器都使用BrowserName / VersionNumber格式設(shè)置名稱和版本,但I(xiàn)nternet Explorer明顯例外。但是,由于該名稱不是該格式的用戶代理字符串中的唯一信息,因此您無法發(fā)現(xiàn)瀏覽器的名稱,只能檢查您正在查找的名稱。但請注意,有些瀏覽器在說謊:例如Chrome報告Chrome和Safari。因此,為了檢測Safari,您必須檢查Safari字符串以及Chrome字符串是否存在,Chromium經(jīng)常將自己報告為Chrome,或者Seamonkey有時會將其自身報告為Firefox。
另外請注意,不要在BrowserName上使用簡單的正則表達(dá)式,用戶代理還包含Keyword / Value語法之外的字符串。例如,Safari和Chrome包含“像Gecko”這樣的字符串。
必須包含 | 不得包含 | ||
---|---|---|---|
火狐 | 火狐/ XYZ | Seamonkey的/ XYZ | |
Seamonkey | Seamonkey的/ XYZ | ||
Chrome | Chrome / XYZ | Chromium / XYZ | |
Chromium | Chromium/ XYZ | ||
蘋果瀏覽器 | Safari瀏覽器/ XYZ | Chrome / xyz或Chromium / xyz | Safari提供了兩個版本號,一個是Safari / xyz標(biāo)記中的技術(shù),一個是用戶友好的版本/ xyz標(biāo)記 |
Opera | OPR / xyz 1 Opera / xyz 2 | 1 Opera 15+(基于閃爍的引擎)2 Opera 12-(基于Presto的引擎) | |
Internet Explorer | ; MSIE xyz; | Internet Explorer不會以BrowserName / VersionNumber格式放置其名稱 |
當(dāng)然,絕對不能保證其他瀏覽器不會劫持一些這樣的東西(比如過去Chrome就劫持了Safari字符串)。這就是為什么使用用戶代理字符串進(jìn)行瀏覽器檢測是不可靠的,只能通過檢查版本號來完成(劫持過去版本的可能性較小)。
瀏覽器版本通常(但并非總是)放入用戶代理字符串中的BrowserName / VersionNumber標(biāo)記的值部分。這對于Internet Explorer(將版本號恰好放在MSIE令牌之后)和Opera 10之后的Opera添加了版本/ 版本號令牌當(dāng)然不是這種情況。
同樣,請務(wù)必為您正在尋找的瀏覽器選擇正確的標(biāo)記,因?yàn)椴荒鼙WC其他將包含有效的數(shù)字。
如前所見,在大多數(shù)情況下,尋找渲染引擎是更好的方法。這將有助于不排除鮮為人知的瀏覽器。共享一個通用渲染引擎的瀏覽器將以同樣的方式顯示一個頁面:一個公平的假設(shè)是,一個工作在另一個工作中。
有五個主要的渲染引擎:Trident,Gecko,Presto,Blink和WebKit。由于嗅探渲染引擎名稱很常見,因此許多用戶代理添加了其他渲染名稱以觸發(fā)檢測。因此,在檢測渲染引擎時注意不要觸發(fā)誤報。
必須包含 | ||
---|---|---|
壁虎 | 壁虎/ XYZ | |
WebKit | AppleWebKit / XYZ | 請注意,WebKit瀏覽器會添加一個'像Gecko'字符串,如果檢測不夠謹(jǐn)慎,可能會觸發(fā)Gecko的誤報。 |
Presto | Opera / XYZ | 注意:Presto不再用于Opera瀏覽器版本> =版本15(請參閱'閃爍') |
Trident | Trident / XYZ | Internet Explorer將此令牌放入用戶代理字符串的注釋部分 |
Trident | Chrome/ XYZ |
大多數(shù)渲染引擎將版本號放入RenderingEngine / VersionNumber令牌中,但Gecko明顯例外。Gecko將Gecko版本號放在rv:
字符串后面的User Agent的注釋部分。從手機(jī)版的Gecko 14和桌面版的Gecko 17中,它也將這個值放在Gecko/version
令牌中(以前的版本中有構(gòu)建日期,然后是一個名為GeckoTrail的固定日期)。
操作系統(tǒng)在大多數(shù)用戶代理字符串中給出(盡管不是像Firefox OS這樣的網(wǎng)絡(luò)集中式平臺),但是格式各不相同。它是用戶代理注釋部分中兩個分號之間的固定字符串。這些字符串對于每個瀏覽器都是特定的。它們表示操作系統(tǒng),但也常常是其依賴硬件(32位或64位或Intel / PPC for Mac)的版本和信息。
就像在所有情況下一樣,這些字符串將來可能會發(fā)生變化,應(yīng)該將它們僅用于檢測已發(fā)布的瀏覽器。當(dāng)新的瀏覽器版本出現(xiàn)時,必須進(jìn)行技術(shù)調(diào)查以適應(yīng)腳本。
執(zhí)行用戶代理嗅探的最常見原因是確定瀏覽器運(yùn)行的設(shè)備類型。目標(biāo)是為不同的設(shè)備類型提供不同的HTML。
切勿假設(shè)瀏覽器或渲染引擎僅在一種設(shè)備上運(yùn)行。特別是不要為不同的瀏覽器或渲染引擎設(shè)置不同的默認(rèn)值。
切勿使用OS令牌來定義瀏覽器是否在移動設(shè)備,平板電腦或臺式機(jī)上。操作系統(tǒng)可能運(yùn)行在多種類型的設(shè)備上(例如,Android可以在平板電腦以及手機(jī)上運(yùn)行)。
下表總結(jié)了主要瀏覽器供應(yīng)商表示其瀏覽器在移動設(shè)備上運(yùn)行的方式:
瀏覽器 | 規(guī)則 | 例 |
---|---|---|
Mozilla(Gecko,F(xiàn)irefox) | 手機(jī)或平板電腦令牌在評論中。 | Mozilla / 5.0(Android; Mobile; rv:13.0)Gecko / 13.0 Firefox / 13.0 |
基于WebKit的(Android,Safari) | 評論之外的移動Safari標(biāo)記。 | Mozilla / 5.0(Linux; U; Android 4.0.3; de-ch; HTC Sensation Build / IML74K)AppleWebKit / 534.30(KHTML,如Gecko)Version / 4.0 Mobile Safari / 534.30 |
基于閃爍(Chromium,Google Chrome,Opera 15+) | 評論之外的移動Safari標(biāo)記 | Mozilla / 5.0(Linux; Android 4.4.2); Nexus 5 Build / KOT49H)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 33.0.1750.117 Mobile Safari / 537.36 OPR / 20.0.1396.72047 |
基于Presto(Opera 12-) | Opera中的Opera Mobi / xyz令牌(Opera 12-) | Opera / 9.80(Android 2.3.3; Linux; Opera Mobi / ADR-1111101157; U; es-ES)Presto / 2.9.201版本/ 11.50 |
Internet Explorer | IEMobile / xyz令牌的評論。 | Mozilla / 5.0(兼容; MSIE 9.0; Windows Phone OS 7.5; Trident / 5.0; IEMobile / 9.0) |
總之,我們建議在用戶代理的任何位置查找字符串“Mobi”以檢測移動設(shè)備。
如果設(shè)備足夠大以至于沒有標(biāo)記“Mobi”,則應(yīng)該為您的桌面站點(diǎn)提供服務(wù)(作為最佳做法,無論如何應(yīng)該支持觸摸輸入,因?yàn)殡S著觸摸屏出現(xiàn)更多臺式機(jī))。