如何讓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;
}
...
}
...
}
這裡只給了禁止訪問
。不清楚如果改寫成重定向