Nginx 中如何当请求量超过 limit_req 时重定向到其他链接

Nginx 中如何当请求量超过 limit_req 时重定向到其他链接

我一直尝试使用 Nginx 中的 limit_req 模块来限制来自单个 IP 地址的请求,但成功了。但现在我想重定向到另一个网页来显示一些消息。我该怎么做?似乎 Nginx 只支持 limit_req_status 来更改响应状态代码

答案1

这很简单。如果您真正想要做的是完全屏蔽此人,而不是向他们显示消息,我可以提供一个“替代”答案。(因为机器人从什么时候开始阅读消息的)

对我来说,我有fail2ban在观察/var/log/nginx/blocked.log因此,我们不应该仅仅显示错误代码,而应该在日志中提到这些错误时立即将其消除。

首先,定义一个错误页面,并使任何人/任何访问该错误页面的内容都记录到我们的“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 文件的不必要的重复访问。因此,我在 server { ... } 块中加入了以下内容。

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

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

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

希望对你有帮助!

相关内容