NGINX在if块中使用Custom / Map变量

时间:2016-01-12 21:22:28

标签: cookies nginx config

NGINX 1.9x / RHEL

如果没有设置cookie,我正在尝试为某个请求返回204。我无法获取nginx.conf文件来传递config test或restart。尝试对创建的MAP变量进行测试时,第一个IF块失败。

    http block...
    map $http_cookie $my_login_cookie {
      default 0;
      "~hello_logged_in" 1;
    }


    Server Block....

    location ~ /$ {

      if ($my_login_cookie = 0) { <<<<<< Statement is not working
          if ($args ~ "^Blah=(.*)") {
            return 204;
          }
       }
    }

我发现很多代码示例表明这种事情应该是可行的。我错过了什么?!?!

&LT;&LT;&LT;&LT;&LT;&LT;更新的最终工作代码&gt;&gt;&gt;&gt;&gt;&gt;

    http block...
    map $http_cookie $my_login_cookie {
      default 0;
      "~hello_logged_in" 1;
    }

    Server Block....

    location ~ /$ {

      set $my_redirect y;

      if ($my_login_cookie = 0) {
         set $my_redirect "${my_redirect}e";
      }

      if ($args ~ "^blah=(.*)") {
         set $my_redirect "${my_redirect}s";
      }

      if ($my_redirect = "yes") {
          return 204;
      }

   }

1 个答案:

答案 0 :(得分:1)

nginx不支持嵌套ifs和多个条件if。

您错过了{after if($ my_login_cookie = 0),否则您会在"if" directive is not allowed here行收到以下警告if ($args ~ "^Blah=(.*)") {

您的配置的可能解决方案:

# test whether my_login_cookie is set
if ($my_login_cookie = 0) {
  set $test C;
}

# test
if ($args ~ "^Blah=(.*)") {
  set $test "${test}A";
}

# if both of the above tests are true return
if ($test = CA) {
  return 204;
}