使用 Rulesets API 通过 API 在 zone 级别创建速率限制规则。
速率限制规则与 Ruleset Engine 处理的常规规则类似,但包含一个额外的 ratelimit 对象,用于速率限制配置。有关此字段及其参数的更多信息,请参阅 速率限制参数。
您必须将速率限制规则部署到 http_ratelimit 阶段入口点规则集。
速率限制规则必须出现在规则列表的末尾。
如果使用 Terraform,请参阅 使用 Terraform 配置速率限制规则。
要为 zone 创建 rate limiting rule,请将规则 with a ratelimit object 添加到 http_ratelimit 阶段入口点规则集。
调用 Get a zone entry point ruleset 操作,获取
http_ratelimit阶段入口点规则集的定义。此任务需要 zone ID。如果入口点规则集已存在(即你收到
200 OK状态码以及规则集定义),请记下响应中的规则集 ID。然后调用 Create a zone ruleset rule 操作,将 rate limiting rule 添加到现有规则集。详情请参阅下方示例。如果入口点规则集不存在(即在步骤 1 中收到
404 Not Found状态码),请使用 Create a zone ruleset 操作创建它。将你的 rate limiting rule 包含在rules数组中。示例请参阅 Create ruleset。
此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID。
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600
}
}'要为新规则定义特定位置,请根据更改规则集中的规则顺序中的指南,在请求正文中包含 position 对象。
有关通过单次 API 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则。
此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID。
新规则为因速率限制而被阻止的请求定义了自定义响应。
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"action_parameters": {
"response": {
"status_code": 403,
"content": "You have been rate limited.",
"content_type": "text/plain"
}
},
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600
}
}'要为新规则定义特定位置,请根据更改规则集中的规则顺序中的指南,在请求正文中包含 position 对象。
有关通过单次 API 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则。
此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID。
新规则在计算速率时不考虑对缓存资源的请求("requests_to_origin": true)。
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My rate limiting rule",
"expression": "(http.request.uri.path matches \"^/api/\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"ip.src",
"http.request.headers[\"x-api-key\"]"
],
"period": 60,
"requests_per_period": 100,
"mitigation_timeout": 600,
"requests_to_origin": true
}
}'要为新规则定义特定位置,请根据更改规则集中的规则顺序中的指南,在请求正文中包含 position 对象。
有关通过单次 API 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则。
此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID。
新规则是一条基于复杂度的速率限制规则,会将 my-score HTTP 响应头纳入计算,以得出客户端的总复杂度分数。当匹配速率限制规则的计数表达式时(在本例中,由于 counting_expression 为空字符串,与规则表达式相同),会更新总分计数器。当该总分在 60 秒(一分钟)内超过 400 时,之后的客户端请求将在 600 秒(10 分钟)内被阻止。
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"description": "My complexity-based rate limiting rule",
"expression": "(http.request.uri.path wildcard \"/graphql/*\")",
"action": "block",
"ratelimit": {
"characteristics": [
"cf.colo.id",
"http.request.headers[\"x-api-key\"]"
],
"score_response_header_name": "my-score",
"score_per_period": 400,
"period": 60,
"mitigation_timeout": 600,
"counting_expression": ""
}
}'要为新规则定义特定位置,请根据更改规则集中的规则顺序中的指南,在请求正文中包含 position 对象。
有关通过单次 API 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则。
使用 Rulesets API 中的不同操作处理您刚创建的规则。下表列出了在 zone 级别处理速率限制规则的常见任务:
| 任务 | 步骤 |
|---|---|
| 列出 ruleset 中的所有规则 | 使用 Get a zone entry point ruleset 操作,并指定 更多信息请参阅 View a specific ruleset。 |
| 更新规则 | 使用 Update a zone ruleset rule 操作。 你需要提供 ruleset ID 与规则 ID。要获取这些 ID,可使用 Get a zone entry point ruleset 操作并指定 更多信息请参阅 Update a rule in a ruleset。 |
| 删除规则 | 使用 Delete a zone ruleset rule 操作。 你需要提供 ruleset ID 与规则 ID。要获取这些 ID,可使用 Get a zone entry point ruleset 操作并指定 更多信息请参阅 Delete a rule in a ruleset。 |
这些操作在 Ruleset Engine 文档中均有介绍。Ruleset Engine 为包括 rate limiting rules 在内的多个 Cloudflare 产品提供支持。
有关通过 API 在账户级别部署速率限制规则的说明,请参阅 通过 API 创建速率限制规则集。