nginx中的速率限制基于http标头



也许我问了一个糟糕的问题,但我想在nginx中应用基于自定义http标头而不是基于IP的速率限制。我的基于 IP 的配置正在工作,但我无法使用自定义 http 标头。我想要的是,如果 http 请求中存在特定的标头,则应应用速率限制,否则不会。

会议文件

       http {
            limit_req_zone $http_userAndroidId zone=one:10m rate=1r/s;
       location ^~ /mobileapp{
             set $no_cache 1;
             # set rate limit by pulkit
            limit_req zone=one burst=1;
            limit_req_status 429;
            error_page  429  /50x.html; 
      }
}

但是,即使不存在标头,也会应用速率限制。P.S. userAndroidId 是我的请求标头。

我认为你可以用地图来管理它。如果标头存在,请将变量映射到客户端的 IP 或空字符串,并将该值用作区域的键。如果映射不匹配,则空字符串将阻止发生速率限制。

像这样的东西(未经测试,但应该可以工作)

map $http_userandroidid $limit {
    default "";
    "~.+" $binary_remote_addr;
}

这会将缺少的 userAndroidId 标头的空映射到 ",并将任何其他值映射到 $binary_remote_addr。然后,您可以在区域中使用 $limit 变量,如下所示:

limit_req_zone $limit zone=one:10m rate=1r/s;

最新更新