Назад | Перейти на главную страницу

Как перенаправить на другую ссылку при лишнем запросе (limit_req) с Nginx

Я пытался ограничить запросы, поступающие с одного IP-адреса, успешно с модулем limit_req в Nginx. Но теперь я хочу перенаправить на другую веб-страницу для отображения некоторых сообщений. Как я могу это сделать? Похоже, Nginx просто поддерживает limit_req_status для изменения кода состояния ответа

Это просто. Я могу дать «альтернативный» ответ, если вы действительно хотите полностью заблокировать этого человека, а не показывать ему сообщение. (потому что с каких это пор боты читают сообщения)

Для меня я смотрю 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. Итак, у меня в блоке сервера {...} есть следующее ..

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, добавьте следующий блок в файл conf в /etc/fail2ban/jail.d/

[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 =

Надеюсь, это сработает для вас!