一、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;
}