Nginx のmapモジュールで複数(AND)条件を書く方法

Nginx のmapモジュールで複数(AND)条件を書く方法 技術ネタ

Nginx のmapモジュールで、複数の変数を使って条件を書く方法についてです。



書き方

map の string部分に 複数の変数を結合するような形 で指定します。

map "${hoge1}${hogr2}" $hoge {
 ・
 ・
}

後は、この2つの変数を結合したような条件を書くだけです。

例えば、hoge1 = abc and hoge2 = def を対象としたい場合は、

map "${hoge1}${hogr2}" $hoge {
  defult 0;
  abcdef 1;
}

といったような感じで、単純に2つの変数を結合した条件を書きます。

具体的な例

別記事で、IPアドレスでアクセス制限するやり方を書きました。

Nginx のIPアドレスアクセス制限とアクセスログ出力先変更

Nginx のIPアドレスアクセス制限とアクセスログ出力先変更

2018年10月22日
その後、IPアドレスだけではなく、ユーザーエージェントも条件に加えて制御したかったため、この方法を調べました。

以下にこの記事に条件を追加した、具体的な例で説明します。
この例は、この2つの条件を満たした場合を「許可しない」としています。
 ・IPアドレス(192.168.0.0/24)
 ・ユーザエージェントに「google」「bing」を含まない

geo $is_allow_ip {
    default          true;
    192.168.0.0/24   false;
}

map $http_user_agent $is_allow_bot {
    default    false;
    ~bing      true;
    ~google    true;
}

map "${is_allow_ip}${is_allow_bot}" $is_deny {
    default     0;
    falsefalse  1;
}

map "${is_allow_ip}${is_allow_bot}" $is_allow {
    default     1;
    falsefalse  0;
}

これで、「$is_deny」が条件を満たす(アクセス許可しない)、「$is_allow」を条件を満たさない(アクセスを許可する)となります。
後は、この変数を使って色々設定制御することで実現できます。

mapモジュールは便利

mapモジュールは便利ですね。
if文で書くと見にくくなりますが、mapで書くとスッキリしてわかりやすくなります。

mapモジュールで複数条件を書きたい方がいたら参考にしてください。