hiahiahia,今天get一个新技能,nginx的deny命令,可以通过这个配置禁用你想禁的IP!
他可能不是最完美的IP封禁方案,但是也是一个方案(✪ω✪)。
场景:当我们想使用deny命令封禁用户IP,并且给用户展示一个封禁页面。
当你给nginx的conf目录添加一个deny.conf,nginx就会根据里面的内容开始封禁访问你服务的IP。例,我的deny.conf内容长这样:
deny 1.1.1.1;
很简单的内容,1.1.1.1是个例子,如果你的IP被掘金写入他的deny.conf,那你就访问不到掘金啦!你可能会看见一个403提示。
但是deny.conf其实不仅仅可以用来禁用IP,它其实是用来控制IP的访问的,也就是,其实也可以允许特定的IP访问。例:
allow 2.2.2.2;
deny all;
这样的意思是所有的IP都禁止访问,除了2.2.2.2(2.2.2.2是真爱啊)。
因为我们的服务默认是所有IP都能访问的,所以可见默认语法是allow all,意思是如果你只写了allow 某个IP,但没有deny all,那其他IP还是可以访问你的服务的哦。
综上,我们就达到了第一步目的,封禁用户IP。此时,用户会看见一个由nginx默认提供的403提示。丑丑的,不行,我们的用户要得到最好的服务,就算是403页面!也是好看的403!(用户:听我说谢谢你( ̄ェ ̄;))。
那简单,nginx还有error_page命令,可以根据不同的状态码返回不同的静态页面或uri。你可以在server里这样这样:
error_page 403 /403.html;
error_page 404 /404.html;
也可以多个状态码就返回一个提示页面:
error_page 403 404 /40*.html;
当然,上面这些html都是nginx机器上的文件。这里的/是相对路径,如果你希望访问其他路径可以加一个location:
location = /40*.html {
root /usr/share/nginx/html;
}
这样nginx会返回/usr/share/nginx/html/40*.html给用户。简单,嘿嘿,美滋滋,当我把我的IP加进deny.conf,然后访问服务!Σ(っ °Д °;)っ,为什么我看见的还是丑丑的nginx默认的403!为什么!
看看我的404呢,加一个location直接返回404
location = /test {
return 404;
}
访问/test。❓,why?为什么404状态的时候能看见我的40*.html。
...
(눈‸눈)
...
(눈‸눈)
...
万能的搜索引擎救救我。
一番查找,看见deny语句还可以写server或者location里,啊,那应该是我们deny了IP之后,所有的请求都返回403,那我们的/40*.html不也被403了嘛,根本走不到里面呀。嘿嘿,那这样呢?魔法对冲:
location = /40*.html {
allow all;
root /usr/share/nginx/html;
}
再次访问服务!
哈!
终于不是nginx默认的403了!
大功告成!
当然了,你的error_page后面配置的可以是其他服务的地址比如:
error_page 403 404 https://xxx.com/403.html;
总结:我们可以在nginx配置中使用deny命令对访问我们服务的IP地址进行控制,可以直接把deny命令写location里或者单独建一个deny.conf把配置写进去(注意这两个方式的影响范围不同)。然后使用error_page命令配置想要返回的对应错误状态的文件或地址,就可以啦。
拜拜~ヾ(•ω•`)o
ε=ε=ε=(~ ̄▽ ̄)~