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

用户代理:PHP解析、browscap和非常规;浏览器“;,php,ms-office,user-agent,browscap,Php,Ms Office,User Agent,Browscap,我正在寻找一种可靠的方法来找出什么用户代理正在请求我的PHP页面。我知道get\u browser和$\u SERVER['HTTP\u USER\u AGENT'],但两者似乎都不可靠 使用get_browser,需要将browscap PHP指令设置为定义用户代理的ini文件。PHP推荐这一个——因此我安装了为LAMP指定的“完整”一个 它与get_browser配合使用效果非常好,适用于您常用的浏览器组合,但我专门处理来自MS Office的请求。在这种情况下,它似乎什么也不返回,就像OS

我正在寻找一种可靠的方法来找出什么用户代理正在请求我的PHP页面。我知道
get\u browser
$\u SERVER['HTTP\u USER\u AGENT']
,但两者似乎都不可靠

使用
get_browser
,需要将browscap PHP指令设置为定义用户代理的ini文件。PHP推荐这一个——因此我安装了为LAMP指定的“完整”一个

它与
get_browser
配合使用效果非常好,适用于您常用的浏览器组合,但我专门处理来自MS Office的请求。在这种情况下,它似乎什么也不返回,就像OSXExcel一样(注意:
$\u服务器['HTTP\u用户\u代理]
是第一行,后面是
get\u浏览器的数组输出
):

更糟糕的是,在某些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\u browser
在这里实际上不太可靠,可以从
$\u服务器['HTTP\u USER\u AGENT']
收集更多信息,该服务器至少为Office请求提供了一系列.NET引用

考虑到这一点,有谁能告诉我一个写得很好的函数,它可以分解
$\u服务器['HTTP\u用户\u代理]
?我运行的每一次搜索结果都是建议使用
get\u browser

如果您想知道为什么在基于Windows的安装中引用MS Office时,
get\u browser
似乎失败了,我们也欢迎您。。。这里有10个不同用户在不同Office应用程序中点击链接的测试(
$\u SERVER
先点击
get\u browser
结果):-注意,在OS X的前三个示例之后,没有任何Office的迹象。我还在MSDN上问了一个相关问题:


总而言之,我希望得到一个短期的解决方案,使用一个好的
$\u SERVER['HTTP\u USER\u AGENT']
解析器,理想情况下,它可以确定请求是否来自MS Office。从长远来看,我需要弄清楚为什么“get_browser”无法与MS Office协同工作,尽管它有一个包含Office数据的最新ini。

服务器根本不可能正确猜测它正在与哪个浏览器/应用程序通信,因为提供的用户代理(正如您自己发现的那样)至少是不可靠的。为最常用的浏览器编写一个用户代理解析器非常容易,但是其他浏览器呢?比如微软办公软件

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


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

我很乐意为MS Office或非MS Office提供最佳猜测。原因是我们有许多文档只引用成员页面,当您在Office中单击链接时,它会在任何重定向后解析最终页面,包括告诉您此页面仅限成员的重定向。所以Office会将最终目的地提供给一个真正的浏览器,我们的登录会员会收到“您不是会员”错误。我可以想出多种方法来解决这个问题,但其中一种方法涉及猜测用户代理是什么。。。因此,为
$\u服务器['HTTP\u USER\u AGENT']
输出提供一个好的解析器在这里很方便。@lioman您是说您想使用USER-AGENT头进行身份验证吗?如果是这样的话,我真的不建议这样做。@deceze不,如果我知道请求来自Office,我不会将人们重定向到任何错误消息,因为这样Office将获得正确的URL,即使它看不到我页面的内容,但它会将正确的URL传递给浏览器,在我看来,当页面最终显示在浏览器中时,您可以让您的用户登录吗?顺便说一句,如果你必须与用户代理打交道,为什么不编写一个解析器,告诉你客户机是否特别是MS Office?我最初的问题是需要一个解析器,它可以确定MS Office是否是UA。
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
)