【问题标题】:User agent: PHP parsing, browscap and nonconventional "browsers"用户代理:PHP 解析、browscap 和非常规的“浏览器”
【发布时间】:2011-12-29 02:37:25
【问题描述】:

我正在寻找一种可靠的方法来找出哪些用户代理正在请求我的 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,然后是 @987654338 @结果):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 数据的最新 ini。

【问题讨论】:

    标签: php ms-office user-agent browscap


    【解决方案1】:

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

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

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

    【讨论】:

    • 我很乐意对 MS Office 或非 MS Office 进行最佳猜测。原因是我们有许多文档引用了仅限会员的页面,当您单击 Office 内的链接时,它会在任何重定向后解析最终页面,包括告诉您此页面仅限会员的重定向。因此,Office 然后将最终目的地提供给真正的浏览器,而我们登录的会员会收到您不是会员的错误。我可以想出多种方法来解决这个问题,但其中一种方法是猜测用户代理是什么......所以一个很好的 $_SERVER['HTTP_USER_AGENT'] 输出解析器在这里会很方便。
    • @lioman 你是说你想使用 User-Agent 标头进行身份验证,本质上?如果是这样,我真的不建议这样做。
    • @deceze 不,如果我知道请求来自 Office,我不会将人们重定向到任何错误消息,因为 Office 会返回正确的 URL,即使它看不到我页面的内容- 但它会将正确的 URL 传递给浏览器,浏览器经过身份验证才能看到该页面。
    • 在我看来,您可以让您的用户在页面最终显示在浏览器中时登录吗?顺便说一句,如果您必须与用户代理打交道,为什么不编写一个解析器来告诉您客户端是否专门用于 MS Office?
    • 我最初的问题要求解析器能够确定 MS Office 是否是 UA。
    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 2012-10-24
    • 2012-09-25
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多