我一直试图限制来自单个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 =
希望对你有帮助!