Nginx if文で AND、OR 等の論理演算子を使うには?

ショコラ
ショコラ

Nginx if文で AND、OR 等の論理演算子を使うには?

Nginx の if文では AND、OR 等の論理演算子を使うことはできない。また if文を入れ子にすることもできない
この問題は、変数を用いることで対応することができます。

もっさん先輩
もっさん先輩

「192.168.0.1 且つ 192.168.0.2 以外ならメンテナンス中を表示する。」としたいのですが、これはうまくいきません。
まず、nginx が起動しません。

if ($remote_addr != 192.168.0.1 and $remote_addr != 192.168.0.2) {
  return 503 '<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>只今メンテナンス中です。メンテナンス期間:〇月×日▲時~■時</body></html>';
}

nginx の if文は1つしか判定できないみたいです。また、以下のように入れ子にすることもできません。

if ($remote_addr != 192.168.0.1) {
  if ($remote_addr != 192.168.0.2) {
    return 503 '<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>只今メンテナンス中です。メンテナンス期間:〇月×日▲時~■時</body></html>';
  }
}

この問題は、以下のように変数を用いることで対応することができます。

set $ipchk false;
if ($remote_addr = 192.168.0.1) {
  set $ipchk ture;
}
if ($remote_addr = 192.168.0.2) {
  set $ipchk ture;
}
if ($chk = false) {
  return 503 '<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>只今メンテナンス中です。メンテナンス期間:〇月×日▲時~■時</body></html>';
}

因みに
①比較は == ではなく = です。↑見た目が代入っぽく見えて少し怖いですね。
②「false = $chk」のように逆にすることはできません。
③「service nginx reload」では設定ファイルがエラーしていても、前回の起動した状態に戻ってしまうのでエラーに気がつけませんでした。「service nginx stop」から 「service nginx start」するようにします。

シチュエーション

Nginxで2拠点以外からのアクセスでメンテナンス中画面を表示させたい場合に、AND演算子を使って条件を書いたところ上手く動かなかった。

Scroll to Top