Автоматическое определение мобильных браузеров на PHPВпервые в своей практике, делал мобильную версию сайта. Должен скачать, что сделать сайт, который одинаково работал бы на огромном зоопарке мобильных браузеров,  задача не из легких. Однако, в этой статье речь пойдет не об этом.

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

  Самый верный вариант: проверять возможности браузера при помощи js и затем перенаправлять. Но, это не подходит если мы не хотим чтобы пользователь грузил лишние килобайты, а автоматически был перенаправлен на нужную страничку. Поэтому требовалось серверное решение. 

  Когда-то, очень давно, я слышал про сервис Яндекс.Детектор. Его назначение просто и понятно: вы отправляете ему заголовки или user_agent, которые прислал Вам браузер, а сервис в ответе присылает технические характеристики  устройства. То ли сервис чего-то напутал, то ли я чего-то не понял, но Яша упорно не мог определить ни десктопные браузеры, ни мобильные. Единственно верно он определил мобильный браузер моего Fly (на Андроие 2.3.5). Такой расклад меня мягко говоря не устроил, я решил поискать другие решения.

  Как я и предполагал, одной из самых популярных решений - это поиск ключевых слов типа IPhone, Android, Blackberry и т.п. в user_agent браузера. Примеров в сети было много, и собрав несколько из них вполне можно было получить работоспособную функцию. Но учитывая дико растущий рынок смартфонов, и появления новых девайсов и операционок, я все же надеялся найти сервис, который бы пополнялся изо дня в день.

  Такого сервиса я не нашел, но было найдено компромиссное решение: определение браузера по ключевым словам, но с использованием постоянно обновляющегося класса написанного на php. Раз в пол года, Вы обновляете скрипт, и получаете всегда актуальную проверку.

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

Mobile_Detect это легкий класс PHP для обнаружения мобильных устройств. Он использует строку user агента в сочетании со специфическими заголовки HTTP для обнаружения мобильной среды.

Скачать скрипт можно на его githab страницы

Использовать достаточно просто

Подключение





<?php
include 'Mobile_Detect.php';
$detect = new Mobile_Detect();

В наше время никого не удивишь 3-мя версиями сайта: основной(для десктопа), адаптированной(для планшетов), и мобильной. 

Метод, который позволит определить, что пользователь зашел с мобильного устройства (смартфон, телефон и т.п.):





<?php
if ($detect->isMobile()) {
    // выводим мобильную версию сайта
}

С планшета





<?php
if($detect->isTablet()){
    // выводим адаптированную версию браузера
}

Я не делал отдельной адаптированной версии, поэтому меня устроил такой вариант:





if ($detect->isMobile() or $detect->isTablet()){
    // выводим мобильную версию 
}

Для моего проекта было актуально: показывать рекламу того приложения для устройства с которого зашел пользователь. Т.е. зашел он с Android, предлагаем ему скачать Android программу из Play Store, зашел с Iphone даем ссылку на AppStore. С данным классом определить операционную систему можно так:





<?php
if($detect->isiOS()){
    // выводим рекламу для яблокофонов
}




<?php
if($detect->isAndroidOS()){
    // рекламируем приложение корпорации добра
}

   Есть еще куча методов isIphone(), isIpad(), isBlackBerry(), isKindle(), isOpera() и т.д. полный список можно посмотреть запустив demo.php из скачанного архива, либо на demo странице официального сайта скрипта

Проект активно развивается, и используется уже в куче известных систем Drupal, WordPress и т.д.

   В конце лишь напишу, что надо дать возможность пользователю решать, нужна ли ему мобильная версия. Я сделал так: в самом низу мобильной версии сайта, была ссылка на основной сайт, но с параметром http://sitename.ru/?nomobile

   А на сервере просто ставим куку, чтобы в дальнейшем не перенаправлять этого пользователя. Примерно так:





if( isset($_GET['nomobile']) ){
	setcookie('nomobile','1',time()+3600*24,'/');
	$_COOKIE['nomobile'] = 1;
}
define('NOMOBILE',isset($_COOKIE['nomobile']));

и наш скрипт автоматического перенаправления будет выглядеть так:





require_once 'Mobile_Detect.php';
$detect = new Mobile_Detect();
if(!NOMOBILE and ($detect->isMobile() or $detect->isTablet())){
	header("Location: ".'http://m.'.$_SERVER['HTTP_HOST']);
	exit();
}

Спасибо за внимание

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Обрат
# Обрат 17.04.2013 00:19
Да, но проблема- допустим сайт донора скрипта висит или админ сменил профиль сайта и открыл интернет магазин и т.д.: зависеть от его капризов не есть гуд, то есть это не решение вопроса, а приобретение новой головной боли
Leroy
# Leroy 17.04.2013 00:51
чего?
alish_b
# alish_b 29.06.2013 19:13
Супер) Спасибо за сервис)
SvenSoft
# SvenSoft 12.07.2013 01:07
Не определяет google chrome (мобильный)
Leroy
# Leroy 12.07.2013 23:17
последнюю версию скачали?
Myname
# Myname 14.07.2013 19:12
Что можно удалить из этого класса при этом сохранив работоспособность так он весит 40кб после удаления каментов 30кб, а из функций что можно удалить, хотелось бы в районе 15-20кб.

Могли бы привести пару примеров использования

// 4. Keep the value in $_SESSION for later use

// and for optimizing the speed of the code.

if(!$_SESSION['isMobile']){

$_SESSION['isMobile'] = $detect->isMobile();

}



Спасибо за примеры использования
Leroy
# Leroy 15.07.2013 03:03
а к чему это? Какая разница сколько весит php скрипт?

И примеров по моему привел достаточно.
слава
# слава 15.07.2013 04:47
спасибо огромное, отличное решение!)
tweenfaster
# tweenfaster 17.02.2014 09:40
Я так понял скрипт работает автономно? То-есть Из Mobile_Detect.php запрос на обработку http заголовка на сторонний ресурс не отправляется как у Яндекс.Детектор?
Leroy
# Leroy 17.02.2014 12:56
да, так и есть. поэтому его периодически надо обновлять.
Kiskenbassker
# Kiskenbassker 31.03.2014 17:09
Планшетная версия сайта не работает. На планшетах выдает ту версию, которую создал для мобильного телефона. В чем может быть проблема?
lev07
# lev07 13.08.2014 19:55
if($detect->isTablet()) {

header('Location: http://'.getenv("SERVER_NAME").'/tindex. php');

exit();

}



if ( $detect->isMobile()) {

header('Location: http://m.'.getenv("SERVER_NAME"));

exit();

}

ставте в таком порядке .... сначала определяете планшет затем мобилный
Mike
# Mike 23.07.2014 21:02
Не сочтите за рекламу, но есть и более комплексные решения. На пример 51Degrees.com предлагает OpenSource детектор на 6 платформах (PHP, .NET, Java, Python, Perl и C). Фишка в том, что определение устройства происходит без использования регулярных выражений, что существенно ускоряет процесс. Кроме того, сам процесс определения использует значимые части HTTP юзер агента.



Файл с устройствами регулярно обновляется и в нём учитываются еще и девайсы типа книгочиталок, смарт ТВ, планшетов, консолей и даже носимой электроники (на пример Google Glass). Кроме того определяется много полезного помимо типа устройства. На пример: параметры и версия ОС, версия браузера, поддерживаемые MIME типы, различные CSS технологии вроде canvas, разрешение экрана и многое другое.
lev07
# lev07 13.08.2014 20:00
"Файл с­устройствами регулярно обновляется и ­в нём учитываются еще" - угу ключевое слово файл обновляется ... тащить такое на свой сервер от левого дяди? .... пардонте уж лучше Mobile_Detect прошерстю
lev07
# lev07 13.08.2014 20:07
печенье (кука) в данном примере явно лишнее, проще использовать на сессию юзвера $_SESSION['nomobile'] через GET
Romansom
# Romansom 28.08.2014 18:54
После первого входа на сайт через телефон, он не перенаправляет на указанную страницу в коде

Имею код

<?php

session_start();

require_once "Mobile-Detect-master/Mobile_Detect.php";

$detect = new Mobile_Detect();



if ($detect->isMobile() || $detect->isTablet()){

if (!isset($_SESSION["redirect"])){

$_SESSION["redirect"]="redirect";

header('Location: /magazine');

( 1ый раз при заходе, отправляет сразу на эту страницу , а последующие нет)

Как решить проблему?

}

}
PaRtiZzaN
# PaRtiZzaN 17.08.2015 19:47
2 версии я понял как сделать, WEB и PDA допустим, а как сделать ещё WAP для старых мобилок?
Leroy
# Leroy 18.08.2015 07:03
вы думаете стоит это делать? кто сейчас лазит со старых мобилок?
PaRtiZzaN
# PaRtiZzaN 18.08.2015 07:09
Цитирую Leroy:
вы думаете стоит это делать? кто сейчас лазит со старых мобилок?

Даже на андроиде много людей все ещё используют оперу мини... А для них желательно простую вап версию делать.
Leroy
# Leroy 18.08.2015 07:12
Ну тогда проще всего по useragent отслеживать оперу мини, а не операционку.
Николай Кутулупов
# Николай Кутулупов 21.12.2017 14:54
Alcatel 2007D вот недавно нашел такой девайс. Там есть браузер и даже facebook клиент. Яндекс зашел нормально, а вот дальше не переходит практически не куда. Или https или "размер страница слишком большой" 17.12.2017г.
Вот. :cry:
Хоттей
# Хоттей 18.08.2015 20:23
Да, скрипт действительно поддерживается. Создавался 2-а года назад, а последнее обновление 2-а месяца назад. Сейчас буду прикручивать, протестирую :)
DDIM
# DDIM 16.12.2015 10:14
Спасибо за скрипт, но я тут потестил... и решил ограничиться одной строчкой:

if(mb_ereg("Mobile", $_SERVER['HTTP_USER_AGENT'])) {echo "Mobile";}

Потому-что, кроме SimbianOS, все совеременные мобильные платформы содержат слово Mobile в инфе браузера

[color=#ff0000]тест[/color]
Елена
# Елена 15.06.2016 23:56
Спасибо!
Люблю простые изящные решения :)
AlexZin
# AlexZin 09.08.2017 13:53
DDIM, спасибо, помогло - буду тестировать. +rep ;-)
Арт
# Арт 12.12.2017 14:01
Цитирую DDIM:
Спасибо за скрипт, но я тут потестил... и решил ограничиться одной строчкой:

if(mb_ereg("Mobile", $_SERVER['HTTP_USER_AGENT'])) {echo "Mobile";}

Потому-что, кроме SimbianOS, все совеременные мобильные платформы содержат слово Mobile в инфе браузера

Супер! Коммент по ценности как сама статья.
Robin Bad
# Robin Bad 02.02.2016 20:01
Спасибо за статью! Отмечу лишь, что в документации написано, что $detect->isMobile() вернёт true для любого мобильного устройства, включая планшет. Так что проверка:
if ($detect->isMobile() or $detect->isTablet()){
является излишней.
Andrew
# Andrew 25.03.2016 12:55
Граждане, куда втыкать сей код:

if( isset($_GET['nomobile']) ){
setcookie('nomobile','1',time()+3600*24,'/');
$_COOKIE['nomobile'] = 1;
}
define('NOMOBILE',isset($_COOKIE['nomobile']));

Подскажите, пожалуйста! А то у меня при переходе с мобильной версии на полную при такой ссылке: http://blabla.bla/?nomobile вылетает Error:404
Станислав
# Станислав 08.05.2016 18:51
Andrew, в страницу index.php
Андрей81
# Андрей81 23.10.2016 09:56
Вот например есть у меня правая колонка которая выводится через
А как сделать, чтобы на компьютерах она выводилась а на мобильных не выводилась?
moneymakerXA
# moneymakerXA 23.03.2017 12:05
Юзай mdl от гугла, это фреймворк маленький, с помощью него можно сделать хорошую адаптивность. Он определяет размер устройства и исходя из размера определяет его к определенной категории, а дальше через классы ты прописываешь все. Будут вопросы пиши на почту