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


User agent: PHP parsing, browscap and nonconventional "browsers"

我正在寻找一种可靠的方法来找出哪个用户代理正在请求我的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引用。

考虑到这一点,任何人都可以指出我一个写得很好的函数来分解$_SERVER['HTTP_USER_AGENT']? 我运行的每次搜索最终都会建议使用get_browser

关于为什么get_browser似乎无法从基于 Windows 的安装中引用 MS Office 的任何想法也欢迎......以下是不同用户在不同 Office 应用中单击链接的 10 个测试(首先$_SERVER然后get_browser结果(: http://pastebin.com/5m2zWMrt - 请注意,在 OS X 的前三个示例之后,没有任何 Office 迹象。 我还在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数据ini。

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

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

为什么无论如何您都需要知道浏览器的品牌和型号?如果要因为用户拥有的浏览器而调整页面,您应该改用CSS条件注释和/或测试JavaScript可以依赖哪些功能。要有创意,做其他所有事情,只是不要试图猜测浏览器。