首頁  >  問答  >  主體

如何讓nginx對某一個ip在某一時間段內重定向

如何讓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;
                 }
                 ...
                        }
                        ...
                }

這裡只給了禁止訪問。不清楚如果改寫成重定向

漂亮男人漂亮男人2713 天前498

全部回覆(1)我來回復

  • 迷茫

    迷茫2017-05-16 17:22:44

    如果要防攻擊,應該用iptables,隔間時間清空即可。
    如果用Openresty,可以用rewrite_by_lua

    回覆
    0
  • 取消回覆