对来源 IP 进行限制
使用 allow 和 deny 指令进行控制
server {
# 192.168.0.0/16 网段只允许 192.168.0.1 访问
deny 192.168.0.1;
allow 192.168.0.0/16;
allow 10.0.0.1;
allow 10.0.0.2;
allow 10.1.0.0/16;
# 除了以上 allow 的 IP 外,其他来源 IP 都无法访问
deny all;
}
使用 geo 指令进行控制
http {
geo $remote_addr $deny_ip {
# 默认值所有 IP 都无法访问
default 1;
192.168.0.1 1;
192.168.0.0/16 0;
10.1.0.1 1;
10.1.0.2 1;
10.1.0.0/16 0;
}
server {
# 如果 deny_ip 的值为 1,则表示禁止访问
if ($deny_ip) {
return 403;
}
}
}
geo 指令还支持 ranges,对 ip 段进行限制
geo $remote_addr $deny_ip_range {
ranges;
default 1;
192.168.0.5-192.168.0.7 0;
127.0.0.1-127.0.0.255 0;
}
对要访问的域名进行限制
使用 if 语句进行控制
server {
# 如果不是形如:foo.com、www.foo.com、www.sub.foo.com 域名则禁止访问
if ($http_host !~ '^(.*\.)?(foo\.com|bar\.com)$') {
return 403;
}
}
使用 map 指令进行控制
http {
map $http_host $deny_host {
hostnames;
default 1;
# 能匹配 foo.com、www.foo.com、www.sub.foo.com
.foo.com 0;
.bar.com 0;
}
server {
# 如果不在允许访问的域名白名单中,则禁止访问
if ($deny_host) {
return 403;
}
}
}
IF AND 条件书写方式
在大多情况下,使用 map 或者 geo 比使用 if 做判断更为简洁。if 在判断多个条件同时成立的情况依然有用。
if ($scheme = 'http') {
set $test A;
}
if ($request_uri = /) {
set $test "${test}B";
}
if ($http_host = 'foo.com') {
set $test "${test}C";
}
# 当不满足 3 个条件时,则禁止访问
if ($test != ABC) {
return 403;
}