$request_uri 部分的 limit_req 不同

bat*_*to3 1 rewrite nginx rate-limiting

我想为 php-fpm 配置不同的速率限制。

我想要:

  1. 静态文件没有限制,
  2. PHP 请求有限制,
  3. PHP 请求/ admin /.+有不同的限制。

我对实现点 3 有问题。现在我测试:

limit_req_zone $binary_remote_addr zone=php:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=admin:10m rate=9r/s;

server {
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    limit_req_status 429;
# limitng works, server return 404
    location ~ /admin/ {limit_req zone=admin...}

    location ~ [^/]\.php(/|$) {
        limit_req zone=php burst=9 delay=4;
#limit_req not allowed here
        if($request_uri ~ /admin) {limit_req zone=admin...}
#not update limits (lower)
        location ~ ^/admin/ {limit_req zone=admin...}
#negative matching returns index.php content
        location location ~ ^/(?!(admin)) {limit_req zone=php...}
    }
}
Run Code Online (Sandbox Code Playgroud)

也是,但如果我理解的话,这会为和limit_req_zone $request_uri创建不同的池。/admin/1/admin/2

//更新1:

我需要不同的池来满足以下请求: /index.php?/.*并且不太严格/index.php?/admin/.*

Iva*_*sky 5

根据limit_req_zone指令文件

不考虑具有空键值的请求。

因此,只需limit_req在 PHP 处理程序位置中使用两个指令,并将其中一个区域键设置为空,具体取决于$request_uri(在这种情况下,将不应用第一个或第二个请求限制率):

map $request_uri $is_admin {
    ~^/admin/  1;
    default    0;
}
map $is_admin $php_key {
    0 $binary_remote_addr;
    # an empty value otherwise by default
}
map $is_admin $admin_key {
    1 $binary_remote_addr;
    # an empty value otherwise by default
}

limit_req_zone $php_key zone=php:10m rate=2r/s;
limit_req_zone $admin_key zone=admin:10m rate=9r/s;

server {
    ...
    location ~ [^/]\.php(/|$) {
        limit_req zone=php ...
        limit_req zone=admin ...
        ...
Run Code Online (Sandbox Code Playgroud)