一、if语句中的判断条件(nginx)

1、正则表达式匹配:

==:等值比较;
~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;

2、文件及目录匹配判断:

-f, !-f:判断指定的路径是否为存在且为文件;
-d, !-d:判断指定的路径是否为存在且为目录;
-e, !-e:判断指定的路径是否存在,文件或目录均可;
-x, !-x:判断指定路径的文件是否存在且可执行;

二、场景示例

公司API文档包含在某个Java应用或者Golang应用中,我们只针对API文档接口进行屏蔽或者限制IP访问,其余接口则是正常访问。

【示例1】直接屏蔽掉接口文档

    #添加nginx ingress注解,如果请求url中包含"/doc.html|/swagger" 则返回403
    nginx.ingress.kubernetes.io/server-snippet: |
      if ( $request_uri ~*  (/doc.html|/swagger)) {
                 return 403;
      }

【示例2】接口只开放某个IP白名单进行访问

nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现:

 #首先是伪代码(即不被nginx支持),写在这里只是为了方便理解:
 #解析:如果访问请求url中包含"/doc.html|/swagger"并且访问IP不是公司IP 222.222.222.222 就返回403,反之如果是公司IP的话就正常访问。
 if ( $request_uri ~*  (/doc.html|/swagger) &&  $remote_addr !~* ^222.222.222.222 ) {
      return 403;
 }

上面语法不被NGINX支持,下面是NGINX或者NGINX ingress 支持的正确语法,用变量的方式来实现。

#NGINX ingress 配置示例  
nginx.ingress.kubernetes.io/server-snippet: |
  set $test '';
  if ($request_uri ~*  (/doc.html|/swagger)){  
          set $test 1;
  }
  if ( $remote_addr !~* 222.222.222.222 ) {
          set $test "${test}2";
  }
  if ( $test = 12 ) {
          return 403;
  }

参考:https://nestealin.com/31f5fa47/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据