一些web服务,出于安全考虑是不想让其他人访问到,除了添加登录用户认证外,还可以使用Nginx限制IP访问,只允许指定IP的用户访问站点或者接口。即nginx deny ip access
Nginx中限制IP访问的一般用法是在location中使用allow和deny来限制,如:
location / {
allow 127.0.0.1;
allow 172.0.0.0/8;
allow 10.10.0.0/16;
allow 202.106.0.20/32;
allow 114.114.114.114/32;
deny all;
}
实际应用中由于我们配置了泛解析域名,location中用到了if语句来匹配server_name,而allow和deny指令无法使用在if语句里面。
Nginx deny的用法:
deny
语法: deny address | CIDR | unix: | all;
默认值: —
配置段: http, server, location, limit_except
如果在if语句下使用deny指令会有如下报错:
"deny" directive is not allowed here in /etc/nginx/conf.d/default.conf:21
还有一个问题是Ningx配置是不支持if嵌套的,所以下面使用了set变量的方式来实现嵌套功能,使用return 403来替代deny指令,具体如下:
server {
listen 80;
server_name ~^(?<subdomain>.+)\.sudops\.com$;
location / {
set $myoffice 0;
if ($host = "subdomain.sudops.com") {
proxy_pass http://172.30.1.11:2019;
set $myoffice "${myoffice}1";
}
if ($remote_addr !~ "^(127.0.0.1|172.|10.10.|202.106.0.20|114.114.114.114)") {
set $myoffice "${myoffice}2";
}
if ($myoffice = "012") {
return 403;
}
}
}