2011-11-14 39 views
0

我正在尋找一種可靠的方法來找出哪些用戶代理正在請求我的PHP頁面。我知道get_browser以及$_SERVER['HTTP_USER_AGENT']但似乎都不可靠。用戶代理:PHP解析,browscap和非常規「瀏覽器」

使用get_browser,您需要將browscap PHP指令設置爲定義用戶代理的ini文件。 PHP推薦這個 - http://browsers.garykeith.com/downloads.asp - 所以我安裝了LAMP指定的「完整」。

它適用於你平常的瀏覽器組合,它的效果很好,但我特別處理MS Office的請求。在這種情況下,它似乎沒有什麼回報,就像OS X的Excel(注:$_SERVER['HTTP_USER_AGENT']是第一線,隨後get_browser陣列輸出):

Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/14.0.0 

Array 
(
    [browser_name_regex] =  ^.*$ 
    [browser_name_pattern] =  * 
    [browser] =  Default Browser 
    [version] =  0 
    [majorver] =  0 
    [minorver] =  0 
    [platform] =  unknown 
    [alpha] =  
    [beta] =  
    [win16] =  
    [win32] =  
    [win64] =  
    [frames] =  
    [iframes] =  
    [tables] =  
    [cookies] =  
    [backgroundsounds] =  
    [javascript] =  
    [vbscript] =  
    [javaapplets] =  
    [activexcontrols] =  
    [isbanned] =  
    [ismobiledevice] =  
    [issyndicationreader] =  
    [crawler] =  
    [cssversion] =  0 
    [aolversion] =  0 
) 

更糟糕的是,它似乎沒有提到辦公室在某些Windows案例:

Mozilla/4.0 (compatible; MSIE 7.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) 

Array 
(
    [browser_name_regex] =  ^mozilla/4\.0 (compatible; msie 7\.0.*; .*windows nt 6\.1.*).*$ 
    [browser_name_pattern] =  Mozilla/4.0 (compatible; MSIE 7.0*; *Windows NT 6.1*)* 
    [parent] =  IE 7.0 
    [platform] =  Win7 
    [browser] =  IE 
    [version] =  7.0 
    [majorver] =  7 
    [win32] =  1 
    [frames] =  1 
    [iframes] =  1 
    [tables] =  1 
    [cookies] =  1 
    [backgroundsounds] =  1 
    [javascript] =  1 
    [vbscript] =  1 
    [javaapplets] =  1 
    [activexcontrols] =  1 
    [cssversion] =  2 
    [minorver] =  0 
    [alpha] =  
    [beta] =  
    [win16] =  
    [win64] =  
    [isbanned] =  
    [ismobiledevice] =  
    [issyndicationreader] =  
    [crawler] =  
    [aolversion] =  0 
) 

通過這些例子來看,似乎get_browser實際上是不太可靠這裏更多的信息可以從$_SERVER['HTTP_USER_AGENT']至少吐出一堆.NET引用該辦公室要求收集。

考慮到這一點,任何人都可以指向一個寫得很好的功能,打破$_SERVER['HTTP_USER_AGENT']?我運行的每個搜索結果都是建議使用get_browser代替。

爲什麼get_browser似乎從基於Windows的安裝引用的MS Office在所有的失敗有什麼想法也歡迎...這裏有各種用戶點擊不同的Office應用程序鏈接的10個測試($_SERVER第一則get_browser結果):http://pastebin.com/5m2zWMrt - 注意在OS X的前三個示例之後沒有任何辦公室標誌。我還在MSDN上詢問了一個相關問題:http://social.msdn.microsoft.com/Forums/en-US/officegeneral/thread/8ad594cd-0dfe-4110-8ffc-4d0caee4c29f

總結起來,我想要得到一個短期解決方案一個很好的解析器$_SERVER['HTTP_USER_AGENT'],理想情況下可以確定請求是否來自MS Office。從長遠來看,我需要弄清楚爲什麼get_browser不能與MS Office一起工作,儘管有最新的ini與Office數據。

回答

0

服務器根本無法正確猜測它正在與哪個瀏覽器/應用程序通話,因爲所提供的用戶代理程序 - 就像您自己發現的那樣 - 至少可以說是不可靠的。爲最常用的瀏覽器編寫用戶代理解析器非常簡單 - 但是其餘部分呢? MS Office,例如?

所以不,不要試圖從服務器端猜測瀏覽器。因爲這就是你在做什麼,猜測 - 不知道。

爲什麼您需要知道瀏覽器的品牌和型號?如果要根據用戶使用哪個瀏覽器來調整頁面,則應該使用CSS conditional comments和/或測試哪些功能可以依賴於JavaScript。要有創意,並且做其他事情,只是不要嘗試猜測的瀏覽器。

+0

我很樂意爲MS Office或NOT MS Office做一個最佳猜測。原因是因爲我們有許多引用會員專用頁面的文檔,並且當您單擊Office內部的鏈接時,它會在任何重定向後解析最終頁面,包括重定向,告訴您此頁面僅限會員。因此,Office會將最終目的地提供給真實的瀏覽器,而我們的登錄成員將獲得您不是會員的錯誤。 我可以想出多種方法來解決這個問題,但其中一個將涉及猜測用戶代理是什麼......所以'$ _SERVER ['HTTP_USER_AGENT']'輸出的一個很好的解析器在這裏很方便。 – lioman

+0

@lioman你是說你想使用用戶代理標題進行認證,本質上?如果是這樣,我真的不會推薦。 – deceze

+0

@deceze不,如果我知道請求來自Office,我將不會將用戶重定向到任何錯誤消息,因爲即使Office無法看到我的頁面內容,Office也會返回正確的URL - 但它會通過右側瀏覽器的URL,通過驗證可以看到該頁面。 – lioman