用戶代理

User Agent

用較為專業的術語來說,User Agent是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。用較為普通的一點來說,是一種向訪問網站提供你所使用的瀏覽器類型、操作系統、瀏覽器內核等信息的標識。通過這個標識,用戶所訪問的網站可以顯示不同的排版從而為用戶提供更好的體驗或者進行信息統計;例如用手機訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據訪問者的UA來判斷的。

基本含義


在X.400電子系統中,用戶代理是一種對數據打包、創造分組頭,以及編址、傳遞消息的部件。
用戶代理是指瀏覽器,它的信息包括硬體平台、系統軟體、應用軟體和用戶個人偏好。用戶代理並不是僅指瀏覽器,還包括搜索引擎。
用戶代理的能力和偏好可以認為是元數據或用戶代理的硬體和軟體的特性和描述。

擴展知識


user-agent是指用戶瀏覽器端的信息,比如你是用IE的還是firefox的,有些網站會根據這個來調整打開網站的類型,如是手機的就打開wap,顯示非手機的就打開pc常規頁面。
許多瀏覽器和下載軟體會偽裝user agent來迴避某些偵測特定瀏覽器才能讀取的網站。

字串史

在《特性檢測並非瀏覽器檢測》貼文中談到了 User-agent嗅探,有回貼支持本人繼續談下去。那本人認為:User-agent 嗅探是必備的一項重要的技術。要知道 user-agent 字串檢測不太精準的原因,必須談這些年來 user-agent 字串發生了怎樣的變化。
較古的瀏覽器
1993年,NCSA發布了首款web 瀏覽器 Mosaic。它的 user-agent 字串非常簡潔:
Mosaic/0.9雖然當時由於它對操作系統和平台的依賴性,但是基本格式還是很簡單明了。在文本中,斜杠前面是產品名稱(可能會顯示為NCSAMosaic或是其他類似的字),斜杠後面是產品版本號。
NetscapeCommunications開發了web 瀏覽器 Mozilla(當時號稱“Mosaic殺手”)。他們首款公開發行版本:NetscapeNavigator2的user-agent 字串具有如下格式:
Mozilla/Version[Language](Platform;Encryption)Netscape按之前的做法在 user-agent 字串的前半部分使用了產品名稱和產品版本,但在後面增加了下列信息:
Language-表示應用程序用的是哪個語言Platform-表示應用程序是在什麼操作系統和/或平台中運行Encryption-表示應用程序包含了什麼安全加密類型。其中的值可能是U(128位加密)、I(40位加密)、N(沒加密)。NetscapeNavigator2的 user-agent 字串的示例:
Mozilla/2.02[fr](WinNT;I)上面的字串指:NetscapeNavigator2.02、法語、WindowsNT、40位加密。在當時,通過 user-agent 字串中的產品名稱,可以正確判斷使用的是哪個web瀏覽器。NetscapeNavigator3、InternetExplorer3。1996年,NetscapeNavigator3發布,它遠遠超過Mosaic成為當時最流行的web瀏覽器。而 user-agent 字串只有些小的變化:去掉了語言部分,多了個放操作系統或CPU的可選信息。格式如下:
Mozilla/Version(Platform;Encryption[;OS-or-CPUdescription])在Windows系統中NetscapeNavigator3的user-agent字串的示例:
Mozilla/3.0(Win95;U)上面的字串指:NetscapeNavigator3、Windows95、128位加密。在Windows系統中,字串裡面不會顯示OS或CPU的信息。
NetscapeNavigator3發布不久,微軟公布了它的首款web 瀏覽器:IE3¹,但是Netscape是當時首選瀏覽器,大多數伺服器在載入頁面前都會檢查user-agent是否為該款瀏覽器。IE如果不兼容Netscapeuser-agent字串,使用IE的用戶就根本打不開這些頁面,於是造就了如下格式:
Mozilla/2.0(compatible;MSIEVersion;OperatingSystem)在Windows95中IE3.02的 user-agent 字串的示例:
Mozilla/2.0(compatible;MSIE3.02;Windows95)由於當時的瀏覽器嗅探只查 user-agent 字串中的產品名稱部分,結果IE搖身一變被識別成了Mozilla,偽裝成NetscapeNavigator。這個做法引發了對瀏覽器識別的爭論。從此以後,瀏覽器真正的版本埋沒在了字串的中間。NetscapeCommunicator4、InternetExplorer4至8 1997年8月,NetscapeCommunicator4發布(發布的名稱中Navigator換成了Communicator),它的 user-agent 字串格式與3版本一致。Windows98中4版本的 user-agent 字串如下:
Mozilla/4.0(Win98;I)Netscape 瀏覽器在更新時,版本也相應增加。4.79版本的 user-agent 字串如下:
Mozilla/4.79(Win98;I)微軟發布IE4時,user-agent 字串更新了版本,格式如下:
Mozilla/4.0(compatible;MSIEVersion;OperatingSystem)在Windows98中IE4的 user-agent 字串的示例:
Mozilla/4.0(compatible;MSIE4.0;Windows98)可以看出,Mozilla的版本與IE實際的版本一致,這樣就可以識別第4代瀏覽器了。但遺憾的是,不久IE4.5馬上就發布了(只在Mac平台),雖然Mozilla版本仍是4,但是IE的版本改成如下:
Mozilla/4.0(compatible;MSIE4.5;Mac_PowerPC)此後,IE的版本一直到7都沿用了這個模式。
而IE8的 user-agent 字串添加了呈現引擎(renderingengine)版本:
Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0)新增的呈現引擎非常重要!這樣IE8以MSIE7.0兼容模式運行時,Trident版本保持不變,而原先IE7的 user-agent 字串不包括Trident版本。這樣可以區分IE7與IE8運行的兼容模式。
注意:別指望能從Mozilla版本中得到什麼靠譜的信息。
Gecko
Gecko是Firefox的呈現引擎。Gecko首次開發是作為Mozilla 瀏覽器 Netscape6的一部分。Netscape6的 user-agent 字串的結構是面向未來的,新版本反應出從4.x版本的簡單變得較為複雜,它的格式如下:
Mozilla/MozillaVersion(Platform;Encryption;OS-or-CPU;Language;PrereleaseVersion)Gecko/GeckoVersionApplicationProduct/ApplicationProductVersion為了更好的理解上面的Gecko user-agent 字串格式,下面來看看各種從基於Gecko 瀏覽器中取得的字串。
WindowsXP中的Netscape6.21:
Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:0.9.4)Gecko/20011128Netscape6/6.2.1在Linux中的SeaMonkey1.1a:
Mozilla/5.0(X11;U;Linuxi686;en-US;rv:1.8.1b2)Gecko/20060823SeaMonkey/1.1a在WindowsXP中的Firefox2.0.0.11:
Mozilla/5.0(Windows;U;WindowsNT5.1;en-US;rv:1.8.1.11)Gecko/20071127Firefox/2.0.0.11MacOSX中的Camino1.5.1:
Mozilla/5.0(Macintosh;U;IntelMacOSX;en;rv:1.8.1.6)Gecko/20070809Camino/1.5.1上面都是基於Gecko的瀏覽器所取得的 user-agent 字串,區別只是版本有所不同。Mozilla版本5.0是自從首款基於Gecko發布后就一直不變,而且以後有可能也不會變²。
2003年,Apple宣布發布首款他們自主開發的web 瀏覽器:Safari。它的呈現引擎叫WebKit。它是Linux中的web 瀏覽器 Konqueror呈現引擎KHTML的一個分支,幾年後,WebKit的開源吸引了呈現引擎的開發人員。
這款新瀏覽器和呈現引擎的開發人員也遇到了曾經IE3.0類似的問題:怎樣才能溶入主流而不被踢出局?答案是:在 user-agent 字串中放詳盡的信息,以便騙取網站的信任使它與其它流行的瀏覽器兼容。user-agent 字串格式如下:
Mozilla/5.0(Platform;Encryption;OS-or-CPU;Language)AppleWebKit/AppleWebKitVersion(KHTML,likeGecko)Safari/SafariVersion下面是示例:
Mozilla/5.0(Macintosh;U;PPCMacOSX;en)AppleWebKit/124(KHTML,likeGecko)Safari/125.1這又是個挺長的 user-agent 字串,其中包括的信息既有AppleWebKit的版本,也有Safari的版本。凡是基於WebKit的瀏覽器都將自己偽裝成了Mozilla5.0,與基於Gecko瀏覽器完全一樣。但Safari的版本是瀏覽器的構建版本號(buildnumber)。Safari1.25在 user-agent 字串中號為125.1(如上所示)。Safari版本3的 user-agent 字串包括了實際的Safari版本:
Mozilla/5.0(Macintosh;U;PPCMacOSX;en)AppleWebKit/522.15.5(KHTML,likeGecko)Version/3.0.3Safari/522.15.5其中的“(KHTML,likeGecko)”在Safari1.0預覽版本中就有了,這字串部分是最耐人尋味又飽受詬病。Apple的野心是為了讓開發人員把Safari當成Gecko,所以採取了當初微軟 IE user-agent 的類似做法:Safari是兼容Mozilla的,否則Safari用戶會認為用的瀏覽器不受支持。
而其它基於WebKit的瀏覽器與Safari不同的是,沒有上面說的這個情況,所以檢測斷定瀏覽器是否基於WebKit比看有沒有明確標Safari更有用。
Konqueror
Konqueror是款在KDELinux 桌面環境中的瀏覽器,基於KHTML開源呈現引擎。它只發布了在Linux的版本,但是擁有活躍的用戶群。為了兼容性最大化,user-agent 字串的格式也緊跟IE的後塵:
Mozilla/5.0(compatible;Konqueror/Version;OS-or-CPU)Konqueror3.2為了與WebKit user-agent 字串變化保持一致,它將KHTML作為它的標識:
Mozilla/5.0(compatible;Konqueror/Version;OS-or-CPU)KHTML/KHTMLVersion(likeGecko)如下所示:
Mozilla/5.0(compatible;Konqueror/3.5;SunOS)KHTML/3.5.0(likeGecko)Konqueror和KHTML的版本號比較一致,唯一的區別就是下點處不同,比如Konquerer3.5、KHTML3.5.1。
GoogleChrome 瀏覽器以WebKit作為呈現引擎,JavaScript引擎卻用了另一種。最初發布的版本是0.2,它的 user-agent 字串格式是在webKit信息的基礎上又增加了如下:
Mozilla/5.0(Platform;Encryption;OS-or-CPU;Language)AppleWebKit/AppleWebKitVersion(KHTML,likeGecko)Chrome/ChromeVersionSafari/SafariVersionChrome0.2 user-agent 信息的示例如下:
Mozilla/5.0(Windows;U;WindowsNT5.1;en-US)AppleWebKit/525.13(KHTML,likeGecko)Chrome/0.2.149.29Safari/525.13雖我不敢完全保證,但很可能WebKit版本和Safari版本總會保持同步。
Opera
Opera 瀏覽器默認 user-agent 字串是現代瀏覽器中最合理的--正確的標識了它自己及其版本。在Opera8.0前,它的 user-agent 字串格式如下:
Opera/Version(OS-or-CPU;Encryption)[Language]在WindowsXP中Opera7.54 user-agent 字串示例:
Opera/7.54(WindowsNT5.1;U)[en]Opera8 user-agent 字串的語言部分移到了括弧內。
Opera/Version(OS-or-CPU;Encryption;Language)在WindowsXP中Opera8 user-agent 字串示例:
Opera/8.0(WindowsNT5.1;U;en)當時Opera做為主流瀏覽器之一,它的 user-agent 字串是唯一使用產品名稱和版本完全真實的標識了它自己。但是由於大量的瀏覽器嗅探代碼在Internet上像蝗蟲飛過般只吃標Mozilla產品名的 user-agent 字串,造成了Opera的 user-agent 字串發生了完全的改變。
Opera9 user-agent 字串有兩種修改的方式:一種方式是將自己標識為Firefox或IE瀏覽器。在這種方式下,user-agent 字串與Firefox或IE的幾乎一樣,只不過末尾附加了“Opera”及版本號。如下所示:
Mozilla/5.0(WindowsNT5.1;U;en;rv:1.8.1)Gecko/20061208Firefox/2.0.0Opera9.50Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;en)Opera9.50前一字串將Opera9.5標識為Firefox2。后一字串將Opera9.5標識為IE6,在兩個字串中都帶有Opera版本信息。雖然這種方式是作為Firefox或IE打開的,但也能識別出Opera。另一種方法則是瀏覽器 user-agent 字串標識偽裝成Firefox或IE,同時也找不到“Opera”字串及其版本信息。這樣從字面上去區分Opera 瀏覽器便成了“不可能完成的任務”。
結論
user-agent 字串史可以說明曾對 user-agent 嗅探說不的原因:IE想要將自己識別為Netscape4,Konqueror和WebKit想要識別為Firefox,Chrome想要識別為Safari。這樣使得除Opera外所有瀏覽器的 user-agent 嗅探區別很小,想要從一堆茫茫瀏覽器海洋中找出有用的標識太少了。關於嗅探要記住:一款瀏覽器與其它瀏覽器是兼容的,這樣造成了不能完全準確的斷定是哪款瀏覽器。
比如說Chrome,它聲稱任何可以在Safari3訪問的網站Chrome也都可以訪問,但是對檢測Chrome沒有一點用。為了瀏覽器的兼容--這便是這個聲明的理由。
(完)
譯註1:IE3不是微軟首款瀏覽器,請參考wiki的Timelineofwebbrowsers。
譯註2:這個是原作者的想法,譯者不敢保證。
譯註3:Opera10的 user-agent 字串大家自己去看吧。

Baiduspider

是指在網頁robots.txt文件里表示針對百度蜘蛛 禁止其訪問及收錄的內容
Baiduspider的user-agent是什麼?
百度各個產品使用不同的user-agent:
產品名稱對應user-agent
無線搜索Baiduspider
圖片搜索Baiduspider-image
視頻搜索Baiduspider-video
新聞搜索Baiduspider-news
百度搜藏Baiduspider-favo
百度聯盟Baiduspider-cpro
商務搜索Baiduspider-ads
網頁以及其他搜索Baiduspider
例如:
User-agent:Baiduspider
Disallow:/close.asp
Disallow:/application.asp
Disallow:/mdb/info.asp
Disallow:/404.htm