问题描述
如何让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; } ...}...}
这里只给出了禁止访问。不清楚如果改写成重定向
问题解答
回答1:如果要防攻击,应该用iptables,隔断时间清空即可。如果用Openresty,可以用rewrite_by_lua