Nginx deny error_page

347 阅读3分钟

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

ε=ε=ε=(~ ̄▽ ̄)~