用户代理:PHP解析,browscap和非常规“浏览器”

时间:2011-11-14 23:42:35

标签: php ms-office user-agent browscap

我正在寻找一种可靠的方法来找出用户代理请求我的PHP页面。我知道get_browser以及$_SERVER['HTTP_USER_AGENT'],但似乎都不可靠。

使用get_browser,您需要将browscap PHP指令设置为定义用户代理的ini文件。 PHP推荐这个 - http://browsers.garykeith.com/downloads.asp - 所以我安装了为LAMP指定的“完整”。

对于您常用的浏览器组合,它适用于get_browser,但我专门处理来自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案例中似乎甚至没有提到Office:

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']收集更多信息,这至少会为Office请求发出一堆.NET引用。< / p>

考虑到这一点,任何人都能指出一个写得好的功能,打破$_SERVER['HTTP_USER_AGENT']?我运行的每次搜索最终都会提出使用get_browser的建议。

对于get_browser在基于Windows的安装中引用MS Office时似乎失败的原因的任何想法也是受欢迎的......这里有10个不同用户点击不同Office应用程序中链接的测试($_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一起工作,尽管有最新的Office数据。

1 个答案:

答案 0 :(得分:0)

服务器无法正确猜测它正在与哪个浏览器/应用程序进行通信,因为所提供的用户代理 - 正如您自己发现的那样 - 至少可以说是不可靠的。为最常用的浏览器编写用户代理解析器非常容易 - 但是其余部分呢?例如,MS Office?

所以不,只是不要试图从服务器端猜测浏览器。因为这就是你在做什么,猜测 - 不知道。

为什么你还需要知道浏览器的品牌和型号?如果要根据用户使用的浏览器来调整页面,则应使用CSS conditional comments和/或测试哪些功能可以依赖JavaScript。要有创意,做其他事情,只是不要试图猜测浏览器。