2

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

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

我现在一直在尝试设置适当的正则表达式来检查 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。

还是有什么其他方法?

我很乐意发表一些评论。

4

3 回答 3

4

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

Modernizr JavaScript 库使这变得相对简单。本文更深入地介绍了为什么这种方法是一个好主意,并展示了一些替代方法来进行特征检测,如果您不想依赖库的话。

于 2013-12-30T16:36:12.070 回答
1

为什么要在服务器上做所有事情?使用 javascript浏览器对象检测并使用 javascript 向用户显示消息。

于 2013-12-30T16:41:26.293 回答
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)。

于 2013-12-30T20:39:25.017 回答