Skip to content
All posts
DevOps

Detect Mobile User Agent in Nginx

April 19, 2022·Read on Medium·

You might notice that some website have 2 different URL for mobile view and desktop view like Facebook. Facebook has m.facebook.com for mobile view and facebook.com for desktop view. Usually, the main website, they don’t care about responsive design. If customer want to well fit the in mobile view, just use the another website which only for mobile view like m.facebook.com (with subdomain of m indicate mobile).

In my opinion, for some reason why developers or companies separate their website responsiveness because building a responsive website is quite painful where need to maintain various of screens. If we separate it into mobile subdomain, we can just focus only on how in mobile UI looks like.

If you open your browser in your mobile phone, you may notice the “Desktop site” checkbox in the setting.

The checkbox “Desktop site” able to switch your browser user agent between mobile agent and desktop agent. If you open facebook.com, you will automatically redirect to m.facebook.com because the server detect your browser as mobile agent. But if you click “Desktop site”, you will be redirect to facebook.com site. Quite awesome right?

In this article, i will show you how we can make the same redirect as facebook do using Nginx.

Let’s get started

I would assumed that, you already have your website configured in Nginx.

Open your current Nginx setting. For the main website ex: example.com, I assumed your Nginx will look something like below

server {
listen 443 ssl http2;
listen [::]:443 ssl http2; server_name example.com; root /var/www/example/public; ...
... }

Add another Nginx config for your mobile version ex: m.example.com,

server {
listen 443 ssl http2;
listen [::]:443 ssl http2; server_name m.example.com; root /var/www/example-mobile/public; ...
... }

What we gonna do here is we need redirect from example.com to m.example.com and vice versa.

For example.com configuration, add below code anywhere inside server section.

perfom.conf View on GitHub
set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "(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") {
   set $mobile_rewrite perform;
}

if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
   set $mobile_rewrite perform;
}

if ($mobile_rewrite = perform) {
   rewrite ^ https://m.$server_name$request_uri redirect;
   break;
}

The configuration should look like this

server {
listen 443 ssl http2;
listen [::]:443 ssl http2; server_name example.com; root /var/www/example/public; set $mobile_rewrite do_not_perform; if ($http_user_agent ~* "(android|bb\d+|meego.....)) {
set $mobile_rewrite perform;
} if ($mobile_rewrite = perform) {
rewrite ^ https://m.$server_name$request_uri redirect;
break;
}
...
... }

The explanation is by default we set a variable $mobile_rewrite to a value “do_not_perform”. You may change to suit with your understanding. For every request, Nginx will runs the If statement to check the user agent is consist mobile agent or not. If exist, change the value of $mobile_rewrite variable to “perform”. Nginx now notice the variable changes and run into another condition. When Nginx detect the variable is “perform”, it rewrite current url into mobile URL.

For m.example.com configuration, add below code anywhere inside server section.

do_not_perform.conf View on GitHub
set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "(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") {
   set $mobile_rewrite perform;
}

if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
   set $mobile_rewrite perform;
}

if ($mobile_rewrite = do_not_perform) {
   rewrite ^ https://example.com$request_uri redirect;
   break;
}

The configuration should look like this

server {
listen 443 ssl http2;
listen [::]:443 ssl http2; server_name example.com; root /var/www/example/public; set $mobile_rewrite do_not_perform; if ($http_user_agent ~* "(android|bb\d+|meego.....)) {
set $mobile_rewrite perform;
} if ($mobile_rewrite = do_not_perform) {
rewrite ^ https://example.com$request_uri redirect;
break;
}
...
... }

Ok now, we are done!. its very simple approach to achieve. You may want to test if there is any nginx error.

> sudo nginx -t

If there is no error, restart your nginx service

> sudo service nginx restart

And all set and should be working fine at this point. Toggle the “Desktop site” button and you will the redirection.

References

If you want to achieve without using Nginx, go to this website http://detectmobilebrowsers.com/ and grab the code from there.

Found this helpful?

If this article saved you time or solved a problem, consider supporting — it helps keep the writing going.

Originally published on Medium.

View on Medium