Требовать минимальные версии браузера для веб-приложения
У меня есть веб-приложение на 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).