Nginx - 源服务器响应代码为 401 时的速率限制



我希望nginx在源服务器响应401状态代码时按user-ip进行速率限制。我该怎么做。我已经为正常的 API 调用设置了一个limit_req_zone设置,如下所示:limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;但我想进一步限制对我的 API 端点进行未经授权的调用的违规者的速率限制。

编辑: 我确实尝试将响应状态 401 映射到 IP 地址并根据映射的变量进行速率限制,但这似乎没有任何作用。请参阅下面的代码。

map $status $limit {
default '';
401 $binary_remote_addr;
}
limit_req_zone $limit zone=api:10m rate=5r/s;

location /api {
limit_req zone=api burst=5;
...
}

这非常棘手,因为在声明limit_req_zone时$status变量为空。只有在nginx处理完请求后,才能知道$status。例如,在proxy_pass指令之后。

我能达到按状态限制的最接近的方法就是执行以下操作:

...
...
...
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
...
...
...
server {
location /mylocation {
proxy_intercept_errors on;
proxy_pass http://example.org;
error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 421 422 423 424 426 428 429 431 451 500 501 502 503 504 505 506 507 508 510 511 @custom_error;
}
location @custom_error {
limit_req zone=api burst=5 nodelay;
return <some_error_code>;
}
}
...

缺点是这样您必须返回不同的状态代码,然后返回代理传递响应。

相关内容

最新更新