如何让nginx对某一个ip在某一时间段内重定向
我写了一个过滤规则:
set $trigger 0;
if ($request_body ~ "woaini|admin"){
set $trigger 1;
}
if ($trigger = 1) {
重定向命令
}
这里有个问题,就是说如果对方满足条件将重定向,可是隔了几十秒或者几秒再访问时,这个重定向就不起作用了。
我是想当对方第一次触发这些规则的时候,让对方的IP在接下来的一天内,无论接下来有没有触发规则,都进行重定向。当过去24小时后,再解封
,如果对方在一天后又触发了,那么再对其进行一天的重定向。
网上说的是使用ngx_white_black_list模块,但是不清楚在源码里的哪个位置写上(重写)黑名单所要运行的命令。一下是网上给出的答案:
动态黑名单
要使用该功能必须对 ngx_http_limit_req_module.c 进行patch
在ngx_http_limit_req_module.c中
增加#include <white_black_list.h>
并修改代码找到:
"
if (rc == NGX_BUSY) {
ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,
"limiting requests, excess: %ui.%03ui by zone \"%V\"",
excess / 1000, excess % 1000,
&limit->shm_zone->shm.name);
"
在其下面增加:
ngx_black_add_item_interface(r, 1);
配备关键字:
dyn_black
格式:
dyn_black $zone_name time;
比如:
dyn_black black 60; //禁止访问60秒,60秒后自动解除
注意:
必须要配置black_list
配置示例:
http{
....
white_black_list_conf conf/black.list zone=black:4m;
limit_req_zone $binary_remote_addr zone=one:8m rate=4r/s;
...
server {
location / {
black_list black on;
limit_req zone=one burst=6;
dyn_black black 60; //禁止访问60秒,60秒后自动解除
...
}
location /xxx {
sec_config on;
}
...
}
...
}
这里只给出了禁止访问
。不清楚如果改写成重定向
如果要防攻击,应该用iptables,隔断时间清空即可。
如果用Openresty,可以用rewrite_by_lua