我有一个 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
最佳答案
1
它不起作用的原因似乎是limit_reg
每个请求只起作用一次。因此,在应用服务器块的限制后,nginx 不会关心其他适用位置的其他限制。请参阅此问题: https:
感谢向我暗示这一点。
|
limit_req
每个请求运行一次。而对于您的情况,它已经运行过location /
,并且在内部重定向后不会再次检查。请参阅–
–
|