Nginx를 통해 웹의 User Agent가 모바일일 때 도메인 변경하기

⁉ How to…

현재 nginx 설정은 다음과 같다. (각각 웹 버전과 모바일 버전 따로 있다.)

server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;

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

	server_name m.exmple.com;
	
	root /var/www/example-mobile/public;
	...
	...
}

example.com에서 m.example.com으로 리다이렉트하도록 설정을 추가해준다.

[example.com](http://example.com) → m.example.com (redirect) 추가

server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;

	server_name exmple.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;
   }
	if ($mobile_rewrite = do_not_perform) { **웹일 경우**
		rewrite ^ https://example.com$request_uri redirect;
		break;
	}
   ...
   ...
}

✓ 위 코드는 가변적인 $mobile_rewrite 값을 do_not_perform 값에 설정한다.

✓ if문을 통해 user agent가 mobile agent로 구성되어 있는지 체크한다.

✓ mobile agent라면, $mobile_rewrite 값을 perform으로 변경한다.

Nginx는 가변적인 변화들에 대해 알린다.

✓ Nginx가 perform 값을 감지하면 (모바일 상태), 현재 url을 모바일 url로 변경시킨다.

테스트를 해보면 다음과 같다.

> sudo nginx -t

> sudo service nginx restart

Reference

Detect Mobile User Agent in Nginx

실제 .conf 설정 코드

server {
    listen 80;

    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 ($mobile_rewrite = perform) { // 모바일 인식할 경우 m.xxx.site redirect
        rewrite ^ https://m.xxx.site$request_uri redirect;
        break;
    }

    location / {
        proxy_pass http://127.0.0.1:xxx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name [domain name];

    return 301 https://www.xxx.site$request_uri;
}

server {
    listen 80;
    server_name m.xxx.site;

    location / {
        proxy_pass http://127.0.0.1:xxx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name console.xxx.site;

    location / {
        proxy_pass http://127.0.0.1:xxx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 80;
    server_name provider.xxx.site;

    location / {
        proxy_pass http://127.0.0.1:xxx;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}