要求Web应用程序的最低浏览器版本

时间:2013-12-30 16:28:30

标签: php user-agent dom4

我有一个PHP的Web应用程序,在前端需要一些更现代的浏览器功能,如MutationObserver。如网站上所述,只有非常新的浏览器支持此功能。对于我需要依赖的一些HTML5功能也是如此。

我现在想要实现的是,使用UserAgent-String检查服务器端用户正在运行哪个浏览器,如果它低于特定版本,则将其重定向到信息页面,在那里他被告知他应该使用更新的浏览器。

我现在已经尝试了一段时间来设置适当的Regex-Expressions来检查UA字符串。但是,由于浏览器制造商并不总是保持一个干净的架构,我陷入了一点困境 - 例如让我们说一个Opera-Browser我需要最低版本12。

  • Opera 12.14示例1: Opera / 9.80(Windows NT 6.0)Presto / 2.12.388版本/ 12.14
  • Opera 12.14示例2: Mozilla / 5.0(Windows NT 6.0; rv:2.0)Gecko / 20100101 Firefox / 4.0 Opera 12.14
    这也可能是Firefox 4.0。
  • Opera 11.51: Mozilla / 5.0(兼容; MSIE 9.0 ; Windows NT 6.1; de)Opera 11.51
    这也可能是Internet Explorer 9.0。

同样跟踪相同的浏览器和版本很棘手,如Opera 12.14的两个示例所示:要么是“Version / 12.14”,要么是“Opera 12.14”或其他一些非常“随机”的字符串。对于其他浏览器,问题非常相似。

所以问题是:你将如何进行?

方法1:
useragentstring.com有一个API,我可以在每次用户访问欢迎页面和/或登录时查询。我不确定这是否是安全性的好主意应用程序性能

方法2:
PHP的get_browser()函数与browscap.ini一起使用。此方法无法区分桌面和移动浏览器。

方法3:
方法2的替代方法可以是phpbrowscap,您可以在其中定义自己的browsercap.ini,而不依赖于您无权访问的服务器上某处的browscap.ini。

或任何其他方法?

我很乐意发表一些意见。

3 个答案:

答案 0 :(得分:4)

现在,许多开发人员使用JavaScript来查询浏览器中是否有可用的功能,而不是保留自己的用户代理和功能数据库,而这些数据库很难正确使用,并且很难保持更新。

Modernizr JavaScript library使这个相对简单。 This article更深入地探讨了为什么这种方法是一个好主意,并且如果你不想依赖一个库,它会显示一些替代方法来进行特征检测。

答案 1 :(得分:1)

为什么要在服务器上执行所有操作?使用javascript browserobject detection并使用javascript向用户显示消息。

答案 2 :(得分:0)

我过去曾使用过这个小曲目(摘录):

var browsers = [{
        browser : "Opera",
        css     : "o",
        engine  : "Presto",
        rex     : {
                    eng : /(?:Gecko|Presto)\/([0-9.]*)/,
                    brw : /.+(?:Opera|Version).([0-9\.]+)/
          },
        ever    : 0,
        bver    : 0
   },{}]

var UA = function(p_ua) {

    var curr, i;

    for (i in browsers) {
        var r = new RegExp(browsers[i].browser);

        if (p_ua.match(r) && (!!browsers[i].rex)) {
            curr = browsers[i];
            curr.ever = curr.rex.eng.exec(p_ua)[1] || curr.rex.eng.exec(p_ua)[0];
            curr.bver = curr.rex.brw.exec(p_ua)[1] || curr.rex.brw.exec(p_ua)[0];

            break;
        }
    }

    return curr;
}

(见jsfiddle)。它并不完整,但它足以满足我当时的需求。在类似的东西之外,客户端上的功能检测绝对是要走的路 - 无论是css,html还是javascript(即http://www.sitepoint.com/detect-css3-property-browser-support/,还是1/3)。我喜欢使用正则表达式 - 但浏览器供应商不能依赖于从版本到版本保持UA字符串相同(更不用说遵循实际标准了!请参阅:useragentstring.com/pages/useragentstring.php).