NGINX实现IF语句里的AND,OR多重判断
正常清空下使用allow,deny 可以完成,但是对于同时过滤ip和页面,就无法按照正常规则去实现
Nginx的rewrite规则参考
- ~ 为区分大小写匹配
- ~* 为不区分大小写匹配
- !
和!*分别为区分大小写不匹配及不区分大小写不匹
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
- last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的
- break 终止匹配, 不再匹配后面的规则
- redirect 返回302临时重定向 地址栏会显示跳转后的地址
- permanent 返回301永久重定向 地址栏会显示跳转后的地址
Nginx参数 | 解释 |
---|---|
arg_PARAMETER | 这个变量包含GET请求中,如果有变量PARAMETER时的值。 |
args | 这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah; |
binary_remote_addr | 二进制的客户地址。 |
body_bytes_sent | 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。 |
content_length | 请求头中的Content-length字段。 |
content_type | 请求头中的Content-Type字段。 |
cookie_COOKIE | cookie COOKIE变量的值 |
document_root | 当前请求在root指令中指定的值。 |
document_uri | 与uri相同。 |
host | 请求主机头字段,否则为服务器名称。 |
hostname | Set to themachine’s hostname as returned by gethostname |
http_HEADER | |
is_args | 如果有args参数,这个变量等于”?”,否则等于””,空值。 |
http_user_agent | 客户端agent信息 |
http_cookie | 客户端cookie信息 |
limit_rate | 这个变量可以限制连接速率。 |
query_string | 与args相同。 |
request_body_file | 客户端请求主体信息的临时文件名。 |
request_method | 客户端请求的动作,通常为GET或POST。 |
remote_addr | 客户端的IP地址。 |
remote_port | 客户端的端口。 |
remote_user | 已经经过Auth Basic Module验证的用户名。 |
request_completion | 如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。 |
request_method | GET或POST |
request_filename | 当前请求的文件路径,由root或alias指令与URI请求生成。 |
request_uri | 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。 |
scheme | HTTP方法(如http,https)。 |
server_protocol | 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
server_addr | 服务器地址,在完成一次系统调用后可以确定这个值。 |
server_name | 服务器名称。 |
server_port | 请求到达服务器的端口号。 |
NGINX实现IF语句里的AND,OR多重判断
nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现
具体方法为AND 就用变量叠加,OR就用0或1切换
如定义结尾以swagger-ui.html和api-docs的页面,只能由202.101.172.35和8.8.8.8访问:
- 伪代码
if ($remote_addr !~ "(202.101.172.35|8.8.8.8)" && $request_uri ~* (swagger-ui.html|api-docs)$) {
return 403;
}
- 上述伪代码Nginx实现
location / {
set $flag 0;
if ($remote_addr !~ "122.224.128.14") {
set $flag "${flag}1";
}
if ($request_uri ~* (swagger-ui.html|api-docs)$) {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}
}