Detect các thiết bị mobile trong nginx

Posted by huylvt on April 18, 2018

Khách hàng của công ty có website chạy 2 phiên bản một phiên bản web ở địa chỉ www.monkidia.com sử dụng cho các thiết bị như máy tính để bàn, máy tính bảng, laptop truy cập và phiên bản mobile ở địa chỉ m.monkidia.com để các thiết bị điện thoại truy cập.

Yêu cầu của họ đặt ra là:

  • Nếu người dùng smartphone khi truy cập vào địa chỉ www.monkidia.com sẽ được chuyển hướng sang bản m.monkidia.com.
  • Nếu người dùng laptop, tablet khi truy cập vào địa chỉ m.monkidia.com thì chuyển hướng về bản web www.monkidia.com

Xử lý logic này trong nginx như sau:


map $http_user_agent $is_desktop {
    default 1;
    ~*(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|mobile.+firefox|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ ce|xda|xiino/i 0; # mobile
    ~*android|ipad|playbook|silk/i 1; # tablet
    ~*spider|crawl|slurp|bot 1; # bots
    ~*windows|linux|os\s+x\s*[\d\._]+|solaris|bsd 1; # OSes
}

map $is_desktop $is_mobile {
    1 0;
    0 1;
}

server {
    listen       80;
    server_name  www.monkidia.com;

    if ($is_mobile) {
        rewrite ^ http://m.monkidia.com$request_uri? redirect;
        break;
    }

    ...
}

server {
    listen       80;
    server_name  m.monkidia.com;

    if ($is_desktop) {
        rewrite ^ http://www.monkidia.com$request_uri? redirect;
        break;
    }

    ...
}