0

我正在寻找一种可靠的方法来找出哪些用户代理正在请求我的 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 的想法也受到欢迎......这里有 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尽管有最新的带有 Office 数据的 ini,但为什么不能与 MS Office 一起使用。

4

1 回答 1

0

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

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

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

于 2011-11-14T23:54:30.973 回答