对来源 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;}
