2011-11-14 97 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