我有一个 Symfony 应用,我想对其进行评级限制。我想要一个一般限制和一个 PHP 请求限制。但是似乎只有一般限制适用。

这是配置(速率值当然仅用于测试目的):

limit_req_zone $binary_remote_addr zone=limit_zone_general:10m rate=2r/m;

limit_req_zone $binary_remote_addr zone=limit_zone_php:10m rate=1r/m;

server {
    # ...
    
    root /var/www/html/public;
    index index.php;

    limit_req zone=limit_zone_general;
    limit_req_status 429;

    location / {
        error_page 404 /meta/404;
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        limit_req zone=limit_zone_php;
        limit_req_status 429;
    }

}

如果我现在调用domain.local/,我预计它每分钟只能调用一次,因为没有静态文档可供使用,因此它应该调用 index.php 并利用其限制。但是一般限制适用,我每分钟可以调用两次。

有人能提示我什么是我没有理解正确的地方吗?

如果已经有人问过类似的问题,我会很乐意去那里看看,但到目前为止,我的搜索还没有找到任何有用的信息。

编辑:到目前为止我已经尝试过:

  • 我尝试将一般限制从服务器块移动到 / 的位置块(因为服务器定义可能“优于”位置定义,但事实并非如此)
  • 我尝试对区域使用不同的键但这也没有任何改变。
  • 彻底删除一般限制。现在 php 特定限制已生效。因此限制本身没有问题。

2

  • limit_req每个请求运行一次。而对于您的情况,它已经运行过location /,并且在内部重定向后不会再次检查。请参阅


    – 

  • 非常感谢你的提示。这解释了一切。现在我只需要弄清楚如何让它适用于我的用例。:)


    – 


最佳答案
1

它不起作用的原因似乎是limit_reg每个请求只起作用一次。因此,在应用服务器块的限制后,nginx 不会关心其他适用位置的其他限制。请参阅此问题: https:

感谢向我暗示这一点。