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

Pul*_*kit 9 http nginx rate-limiting http-headers

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

conf文件

       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; 
      }
}
Run Code Online (Sandbox Code Playgroud)

但是,即使没有标题,也会应用速率限制.PS userAndroidId是我的请求标头.

Tom*_*rts 8

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

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

map $http_userandroidid $limit {
    default "";
    "~.+" $binary_remote_addr;
}
Run Code Online (Sandbox Code Playgroud)

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

limit_req_zone $limit zone=one:10m rate=1r/s;
Run Code Online (Sandbox Code Playgroud)