如何在使用Nginx请求超限(limit_req)时redirect到其他链接

我一直试图限制来自单个IP地址的请求,Nginx模块limit_req成功。 但是现在我想redirect到其他网页来显示一些消息。我可以怎么做? 这看起来像Nginx只是支持limit_req_status更改响应状态代码

这很容易。 如果你真正想要做的就是完全阻止这个人,而不是向他们显示一个信息,我可以提供一个“另类”的答案。 (因为从何时机器人读取消息)

对于我来说,我已经看到了/var/log/nginx/blocked.log文件 ,而不是只显示一个错误代码,只要在这个日志中提到它们就让我们摆脱它们。

首先,定义一个错误页面,使得访问该错误页面的任何人/任何东西都应该logging到我们的'blocked.log'日志文件中(因此将被阻止)

将以下内容放入您的服务器{…}块中

 error_page 577 /577.html; location = /577.html { access_log /var/log/nginx/blocked.log blocked; } 

现在确保你已经定义了这个“被阻止”的格式。

将这一行放入您的http {…}块中,通常位于/etc/nginx/nginx.conf中

 log_format blocked '$time_local Blocked request from $remote_addr $request'; 

在你编辑这个文件的时候,你也可以添加下面一行。 注意区域。

 limit_req_zone $binary_remote_addr zone=wplogin:10m rate=1r/s; 

对于我的例子,我想阻止不必要的重复命中WordPress的wp-login.php文件。 所以我有以下在我的服务器{…}块..

 location ~ [^/]\.php(/|$) { try_files $uri* @fastcgi; location ~* wp\-login\.php { limit_req zone=wplogin burst=1 nodelay; limit_req_status 577; try_files $uri* @fastcgi; } } location @fastcgi { ... stuff for making PHP happen ... } 

奖金

如果您安装了fail2ban,请将以下块添加到/etc/fail2ban/jail.d/中的conf文件

 [nginx-blocked] enabled = true bantime = 600 maxretry = 3 backend = auto findtime = 30 banaction = iptables-multiport protocol = tcp chain = INPUT port = 80,443 filter = nginx-blocked logpath = /var/log/nginx/blocked.log 

然后创build/etc/fail2ban/filter.d/nginx-blocked.conf并插入以下内容

 [Definition] failregex = ^.* Blocked request from <HOST>.*$ ignoreregex = 

希望对你有帮助!