mobile-detector-exey
Время для прочтения: 1 мин. 16 сек.

Создание PDA-версии сайта: определение мобильных пользователей

Очень часто при изготовлении сайта встаёт необходимость в создании облегченной версии (PDA) для телефонов, планшетов и смартфонов.

Чтобы определить, какую версию сайта показывать пользователю для его устройства и реализовать загрузку той версии мобильного приложения, которая больше всего подходит советую использовать API Яндекс.Детектор.

API Яндекс.Детектор предоставляет возможность определения модели и характеристик мобильного устройства пользователя сайта по заголовкам HTTP-запросов, передаваемых браузером его устройства.

Пишем простенькую функцию для определения мобильных браузеров, основанную на примере от Яндекса.

function mobileDetect() {
    $headers = '';

    foreach ($_SERVER as $key => $value) {
        if (strpos($key, 'HTTP_') === 0 && $key != 'HTTP_HOST' && $key != 'HTTP_CONNECTION') {
            $key = strtolower(strtr(substr($key, 5), '_', '-'));
            $headers .= $key . ': ' . $value . "\r\n";
        }
    }

    $opts = array(
        'http' => array(
            'method' => "GET",
            'header' => $headers,
            'timeout' => 6
        )
    );

    $response = file_get_contents('http://phd.yandex.net/detect', false, stream_context_create($opts));
    
    // Распаковать строку
    $response = gzdecode( $response );

    if (preg_match('|<yandex-mobile-info-error>|si', $response)) {
        return false;
    }

    return true;
}

Теперь создаём поддомен на вашем основном домене. Например, если у меня был домен www.peacekeeper.ru, то я создал поддомен pda.peacekeeper.ru (можно и m.peacekeeper.ru).

Использовать нашу функцию будем примерно так: если человек зашел на сайт с мобильного телефона — редиректим его на ту же самую страницу, которую он запросил, только на поддомене pda.peacekeeper.ru.

// Редирект на PDA-версию
if (mobileDetect()) {
    header('Location: http://pda.'.trim($_SERVER['SERVER_NAME'], 'www.').$_SERVER['REQUEST_URI']);
}

Пример можно посмотреть здесь (заходить, естественно, через мобилку). Продолжение следует ヅ

Фото Ексей Пантелеев

Ссылки

Для вставки кода используйте HTML-теги
<pre><code class="php">ваш код</code></pre>

Добавить комментарий

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

21 комментарий

по хронологии
по рейтингу сначала новые по хронологии

Это тупо, потому что каждый рахз при загрузке страницы происходит отправка запроса ещё и на сервер яндекса. Надо покапаться в $headers, которые создаёт эта функция, в них кроется ответ.

Автор
Кобзарёв Михаил

Что вы имели ввиду под словом "покопаться", ведь эту функцию вы сами пишите 🙂 И заголовки сами создаете.

Павел М.

Сергей, хули дела

Пели куки и сессии

Здравствуйте, автор статьи!

А есть ли плюсы или другие минусы пользования услугами программ для создания мобильных версий сайта?

Ну основным минусом является платная версия или вставка ссылок на свои сайты!

Вот сайт dudamobile.com на котором я создал моби версию для своего сайта, но к сожалению так и не могу установить!(

Если будут рекомендации буду благодарен!

Автор
Кобзарёв Михаил

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

Аноним

Сайт peacekeeper.ru не перенаправляет на мобильную версию. Проверял с SE Walkman.

Автор
Кобзарёв Михаил

Код был убран по запросу заказчика

Благодарю за код. То, что нужно.

Автор
Кобзарёв Михаил

Не за что. Рад стараться!

Спасибо, то, что надо.

Денег нет. Могу натурой 🙂

А если не работает? Мне нужно, чтобы перебрасывало не на поддомен а на каталог: "http://cайт.ру/pda/index.php". Я написал это заместо http://pda., но ничего не происходит. Подскажите мне пожалуйста, что именно я не так делаю!

Внутри функции напишите:


$response = file_get_contents('http://phd.yandex.net/detect', false, stream_context_create($opts));
print_r( $response );

Выводит: "Unknown user agent and wap profile"

Когда с телефона заходите?

Да. Но когда на прямую перехожу на phd.yandex.net/detect определяется.

Смотрите строку 23 в коде - я добавил распаковку строки

Теперь вторая функция, для перенаправления, крашит страницу. Может быть я не так пишу место назначения каталога?

Возможно, вы пример свой покажите.

if (mobileDetect()) {
header('Location: http://site.ru/pda/index.php'.trim($_SERVER['SERVER_NAME'], 'www.').$_SERVER['REQUEST_URI']);
}

И мне нет необходимости перенаправлять на туже страницу в мобильной версии.

Для начала попробуйте вывести print_r( $response ); результат в студию

Извините, я с php только начинаю знакомиться-много туплю. Давайте по порядку: на главной странице десктопной версии сайта я написал <?php echo print_r( $response ) ?> и мне вывело "1". Но, как понимаю, должно вывести лог о работе PHP?