Требовать минимальные версии браузера для веб-приложения

У меня есть веб-приложение на PHP, которое во внешнем интерфейсе требует более современных функций браузера, таких как 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; версия 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; де) 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 ответа

Решение

Вместо того, чтобы хранить свою собственную базу данных пользовательских агентов и функций, которые могут быть трудно получить правильные, и боль в том, чтобы постоянно обновляться, многие разработчики в наши дни используют JavaScript для запроса, доступна ли функция в браузере.

Библиотека Modernizr JavaScript делает это относительно просто. В этой статье более подробно рассказывается о том, почему этот подход является хорошей идеей, и показано несколько альтернативных методов обнаружения функций, если вы не хотите полагаться на библиотеку.

Почему вы хотите сделать все на сервере? Используйте браузер JavaScript или обнаружение объектов и используйте JavaScript для отображения сообщения пользователю.

Я использовал эту маленькую пустышку в прошлом (выдержка):

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).

Другие вопросы по тегам