gpt4 book ai didi

nginx - 使用 POST args 对 NGINX 进行速率限制

转载 作者:行者123 更新时间:2023-12-05 03:06:20 24 4
gpt4 key购买 nike

我需要根据 2 个条件在 nginx 中应用速率限制:

  1. 方法是POST
  2. post args 包含“_api”键

<强>1。这无法检测到 Post 请求中的 _api key :

limit_req_zone "$arg__api" zone=api_zone:10m rate=30r/m;
limit_req zone=api_zone burst=10 nodelay;

<强>2。这样可以检测POST方法:

map $request_method $limit {
default "";
POST $binary_remote_addr;
}

limit_req_zone $limit zone=my_zone:10m rate=20r/m;
limit_req zone=my_zone burst=10 nodelay;

那么我如何才能既检测到它是一个 POST 又检测到该帖子包含 _api key ?

更新 1

我只是尝试用这个检测帖子中的 _api key ,但它也不起作用:

map $request_body $api { 
"_api" $binary_remote_addr;
default "";
}
limit_req_zone $api zone=api_api:10m rate=30r/m;
limit_req zone=api_api burst=10 nodelay;

最佳答案

好的,经过许多小时的研究和大量的反复试验,我确定:

$args 只包含 GET 数据

$request_body 包含 POST 数据,但仅在使用时可用:

proxy_pass
fastcgi_pass
uwsgi_pass
scgi_pass

$request_body 是一个字符串,当可用时不会解析为 JSON,因此您不能像使用 $args 那样执行 $request_body_api。

我无法通过在 map 中直接使用 $request_body 来实现它:

map $request_body $body {
default "";
"~*.*(_api)" $binary_remote_addr;
}
limit_req_zone $body zone=body:10m rate=30r/m;
limit_req zone=body burst=5 nodelay;

我能找到的使它起作用的唯一方法是在包含帖子的 header 中添加一个 cookie,这可行但效率不高,因为如果帖子请求很大,它会消耗很多不必要的资源。

add_header Set-Cookie post_data=$request_body;
map $http_cookie $cook_ {
default "";
"~*post_data=.*(\"_api\")" $binary_remote_addr;
}

limit_req_zone $cook zone=cook:10m rate=30r/m;
limit_req zone=cook burst=5 nodelay;

如果我做出了任何不正确的陈述/结论,或者如果有人知道更好的方法,那么请告诉我,这可行,但有点 hack!

关于nginx - 使用 POST args 对 NGINX 进行速率限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49448521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com