基于 http header 的 nginx 中的速率限制
Rate limit in nginx based on http header
也许我问的问题很糟糕,但我想在基于自定义 http header 而不是基于 IP 的 nginx 中应用速率限制。我基于 IP 的配置可以正常工作,但我无法使用自定义 http header。我想要的是,如果 http 请求中存在特定的 header,则应应用速率限制,否则不应用。
配置文件
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;
}
}
但是,即使不存在 header,也会应用速率限制。
P.S。 userAndroidId 是我的请求 header。
我想你可以用地图来解决这个问题。如果 header 存在,则将变量映射到客户端的 IP 或空字符串,并将该值用作区域的键。如果映射不匹配,空字符串将防止速率限制发生。
类似这样的东西(未经测试,但应该有效)
map $http_userandroidid $limit {
default "";
"~.+" $binary_remote_addr;
}
这会将空的缺少的 userAndroidId header 映射到“”,并将任何其他值映射到 $binary_remote_addr。然后,您可以像这样在您的区域中使用 $limit 变量:
limit_req_zone $limit zone=one:10m rate=1r/s;
也许我问的问题很糟糕,但我想在基于自定义 http header 而不是基于 IP 的 nginx 中应用速率限制。我基于 IP 的配置可以正常工作,但我无法使用自定义 http header。我想要的是,如果 http 请求中存在特定的 header,则应应用速率限制,否则不应用。
配置文件
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;
}
}
但是,即使不存在 header,也会应用速率限制。 P.S。 userAndroidId 是我的请求 header。
我想你可以用地图来解决这个问题。如果 header 存在,则将变量映射到客户端的 IP 或空字符串,并将该值用作区域的键。如果映射不匹配,空字符串将防止速率限制发生。
类似这样的东西(未经测试,但应该有效)
map $http_userandroidid $limit {
default "";
"~.+" $binary_remote_addr;
}
这会将空的缺少的 userAndroidId header 映射到“”,并将任何其他值映射到 $binary_remote_addr。然后,您可以像这样在您的区域中使用 $limit 变量:
limit_req_zone $limit zone=one:10m rate=1r/s;