当原始服务器以401状态代码响应时,我希望nginx通过user-ip对速率进行限制。我该怎么做呢我已经为正常的API调用设置了//inserting user image/cover
$type = $this->model->check_type('user');
if($type != NULL){
// do something
}
public function check_Type($type){
$this->db->select('type_id');
$query = $this->db->get_where('image_type', array('type_name' = $type));
if($query->num_rows() > 0){
foreach($query->result() as $row){
$type = $row->type_id;}
return $type;
}else{ return NULL; }
设置,如下所示:limit_req_zone
但我希望进一步限制违规者对我的API端点进行未经授权的调用。
编辑: 我确实尝试将响应状态401映射到ip地址和基于映射变量的速率限制,但似乎没有做任何事情。请参阅下面的代码。
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;
答案 0 :(得分:0)
这很棘手,因为在声明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>;
}
}
...
缺点是,这样您必须返回与代理通过响应不同的状态码。