User-Agent是瀏覽器請求頭中帶有的一個頭信息,包含了http請求發起者的信息。http協議在請求頭中包含這個域的主要目的是為了統計數據,同時可以達到追蹤是否有違背協議的情況出現以及根據特定的用戶適配特定的頁面的需求。瀏覽器領域的紛爭給了UA更多的發展,目前http://www.user-agents.org/列出的ua已經多達上百條。我們目前最常用的就是各種終端設備(尤其是手機)瀏覽器提交請求時設置的UA,比如蘋果iphone手機的UA可能在訪問時就是“IUC(U;iOS 5.0.1;Zh-cn;320*480;)/UCWEB8.1.4.125/42/997”,這個比較文藝,看樣子像是iphone用UC的;一個純粹的果粉可能是“Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8C148”,而android的可能就是“|Mozilla/5.0 (Linux; U; Android 2.2.2; zh-cn; ZTE-U V880 Build/FRF91) UC AppleWebKit/530+ (KHTML, like Gecko) Mobile Safari/530”,symbian可能是“MQQBrowser/2.8 (E71-1;SymbianOS/9.1 Series60/3.0)”。我們可以根據UA統計各種設備的訪問量,達到統計的目的,同時,如果不做UA偽裝的話,也可以找到各種spider和crwaler。
如何去讀一個UA呢?根據RFC2616的描述要求,一個ua字段是這樣的形式User-Agent = "User-Agent" ":" 1*( product | comment ),方便起見,一般所product描述是依照其重要性來排序的,先出現的相對重要一點。product的形式就是名字和版本號,中間用‘/’隔開。就wikipedia上的說法,大多數的瀏覽器目前使用的UA格式如下:Mozilla/[version] ([system and browser information]) [platform] ([platform details]) [extensions]。并在文中舉例:Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405
其中
Mozilla/5.0: Previously used to indicate compatibility with the Mozilla rendering engine (與Mozilla渲染引擎兼容) (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us): Details of the system in which the browser is running (瀏覽器運行的系統信息) AppleWebKit/531.21.10: The platform the browser uses (瀏覽器的平臺?我覺得應該說是瀏覽器引擎,具體說是布局引擎) (KHTML, like Gecko): Browser platform details (瀏覽器引擎信息) Mobile/7B405: This is used by the browser to indicate specific enhancements that are available directly in the browser or through third parties. An example of this is Microsoft Live Meeting which registers an extension so that the Live Meeting service knows if the software is already installed, which means it can provide a streamlined experience to joining meetings 其中各種引擎說明,可以參看這篇文章。
你可以通過這里來測試你的瀏覽器的UA,當然如果自己寫爬蟲的話,也記得做好UA的偽裝工作。如果要做一個PC站點配套的wap站點,如果能力足夠且時間充裕的話,完全可以重寫頁面,用HTML5或者是普通XHTML來進行。寫好以后,條件好的單獨部署單獨維護,條件差的,可以統一部署,由應用服務器端(apache有開源的模塊)根據UA來進行判斷需要顯示的頁面代碼,或者交由框架判斷也可以(寫過濾器對request進行首回合判斷)。