nginx限制ip访问

nginx限制ip,目前从网上发现了两种解决方法

1)是采用原生的方式来实现

set $flag f;
if ($remote_addr = 10.1.20.35 ) {
    set $flag 1;
    rewrite ^ /999.html break;
}
if ($flag = 1){
     rewrite ^ /999.html break;
}
2)是采用geo模块来实现,默认1.16.1是自带的有这个模块

http中增加如下

geo $bad_user {
  default 1;
  172.30.0.60 1;
  172.30.0.178 1;
  10.1.1.70 0;
  10.0.0.0/8 0;
  172.30.1.0/24 0;
}

location中增加如下配置:

if ($bad_user = 1){
  return 500;
}

另外调试中发现有个问题

如果是location /{

} 这种写  rewrite ^ /999.html break; 会自动找html目录下的999.html文件

但是如果是

location /cas {

}这种写  rewrite ^ /999.html break; 会自动找cas 项目下的999.html文件,这个自然就找不到了

所以就想了另一个解决办法,自定义500 return 500;

error_page 500 /999.html;
location =999.html{
  root 999.html;
}

总结:1,采用自定义的500错误解决html找不到的情况

2,nginx-1.16.1 reload的情况下,某些配置是没有生效的,只能-s stop  然后-c nginx.conf才能生效,这个可能是版本之间的差别,间接也导致nginx调试了好久没有生效的原因

3,算是一个笨方法,本来想一个location中限制所有的ip  locaion只能这么写:location ~* /  但是逻辑上有问题,想访问的url,比如 /cas 也都先匹配这个了,就比较矛盾

解决办法就是,所有的location中 都加入 如下的配置,虽然加的地方有些多,但还是解决了问题,后续想想还有没有更好的解决办法

 if ($bad_user = 1){
  return 500;
}

 

posted @ 2020-09-11 15:15  春江潮水连海平  阅读(961)  评论(0编辑  收藏  举报