LoginSignup
8

More than 3 years have passed since last update.

posted at

nginxのconfで複数の条件を判定してリダイレクト

こんにちはガッシーです。
唐突に本題へ入るのが好きじゃないですが入り方に困っています。

前提としてnginxで下記のような運用でメンテナンスを行っているとします。
Nginxでメンテナンスページに編集なしで即時切り替える方法

この例だと、特定のファイルがある場合にメンテナンスをするという条件になっています。

server {
  set $maintenance false;

  if (-e /var/tmp/nginx/maintenance) {
    set $maintenance true;
  }
}

自分が扱っているシステムの方もこのようになっているのですが、
さらにガラケーのアクセスの場合はリダイレクトしてほしいという依頼がきたので対応しようとしたのですが、ここで初めて気づきました。
nginxではif elseが書けないしifの入れ子も書けないということに。

そこで調べていたところ Nginxで複数条件のIF文を書く方法がすごいw という記事を発見。
簡単に書いてみるとこんな感じ。

set $result N
if ($hoge = A) {
  set $result Y;
}
if ($fuga = B) {
  set $result "${result}Y";
}
if ($result = YY) {
  $hogeがAかつ$fugaがBのときの処理
}

こういう発想がすぐできるようになりたいです。
で、ちなみにガラケーの判定は下記のような感じでします。

#device 0 PC 1 スマホ 2 ガラ携帯
set $device 0;
if ($http_user_agent ~* "(iPhone|Android)") {
  set $device 1;
}
if ($http_user_agent ~* "(DoCoMo|UP\.Browser|SoftBank|Vodafone|J-PHONE|emobile|WILLCOM)") {
  set $device 2;
}

そして全てを組み合わせる

server {
  set $maintenance false;
  set $maintenance_redirect N;
  if (-e /var/tmp/nginx/maintenance) {
    set $maintenance true;
    set $maintenance_redirect Y;
  }

  #device 0 PC 1 スマホ 2 ガラ携帯
  set $device 0;
  if ($http_user_agent ~* "(iPhone|Android)") {
    set $device 1;
  }
  if ($http_user_agent ~* "(DoCoMo|UP\.Browser|SoftBank|Vodafone|J-PHONE|emobile|WILLCOM)") {
    set $device 2;
    set $maintenance_redirect "${maintenance_redirect}Y";
  }

  if ($maintenance_redirect = YY) {
    rewrite ^(.*)$ http://hogehoge.com$1 permanent;
  }
  if ($maintenance = true) {
    error_page 503 /error/50x.html;
    return 503;
  }
}

ちょっと汚い&省略していますがこんな感じですかね。
普段rubyしか書かないのでnginxとかシェルとかになるとつまづきます。

参考

Nginxでメンテナンスページに編集なしで即時切り替える方法
Nginxで複数条件のIF文を書く方法がすごいw

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8