跳转到内容
搜索文档

通过 API 创建速率限制规则

最后更新 查看 MarkdownAgent 设置

使用 Rulesets API 通过 API 在 zone 级别创建速率限制规则。

速率限制规则与 Ruleset Engine 处理的常规规则类似,但包含一个额外的 ratelimit 对象,用于速率限制配置。有关此字段及其参数的更多信息,请参阅 速率限制参数

您必须将速率限制规则部署到 http_ratelimit 阶段入口点规则集

速率限制规则必须出现在规则列表的末尾。

如果使用 Terraform,请参阅 使用 Terraform 配置速率限制规则

创建速率限制规则

要为 zone 创建 rate limiting rule,请将规则 with a ratelimit object 添加到 http_ratelimit 阶段入口点规则集。

  1. 调用 Get a zone entry point ruleset 操作,获取 http_ratelimit 阶段入口点规则集的定义。此任务需要 zone ID

  2. 如果入口点规则集已存在(即你收到 200 OK 状态码以及规则集定义),请记下响应中的规则集 ID。然后调用 Create a zone ruleset rule 操作,将 rate limiting rule 添加到现有规则集。详情请参阅下方示例。

  3. 如果入口点规则集不存在(即在步骤 1 中收到 404 Not Found 状态码),请使用 Create a zone ruleset 操作创建它。将你的 rate limiting rule 包含在 rules 数组中。示例请参阅 Create ruleset

示例 A - 基于请求属性的速率限制

此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID

Create a zone ruleset rulebash
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 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则

示例 B - 带自定义响应的速率限制

此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID

新规则为因速率限制而被阻止的请求定义了自定义响应

Create a zone ruleset rulebash
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 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则

示例 C - 忽略缓存资源的速率限制

此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID

新规则在计算速率时不考虑对缓存资源的请求("requests_to_origin": true)。

Create a zone ruleset rulebash
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 调用创建入口点规则集并定义其规则的说明,请参阅向阶段入口点规则集添加规则

示例 D - 基于复杂度的速率限制规则

此示例向 ID 为 $ZONE_ID 的 zone 的 http_ratelimit 阶段入口点规则集添加一条速率限制规则。该阶段入口点规则集已存在,ID 为 $RULESET_ID

新规则是一条基于复杂度的速率限制规则,会将 my-score HTTP 响应头纳入计算,以得出客户端的总复杂度分数。当匹配速率限制规则的计数表达式时(在本例中,由于 counting_expression 为空字符串,与规则表达式相同),会更新总分计数器。当该总分在 60 秒(一分钟)内超过 400 时,之后的客户端请求将在 600 秒(10 分钟)内被阻止。

Create a zone ruleset rulebash
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 操作,并指定 http_ratelimit 阶段名称,以获取已配置的 rate limiting rules 及其 ID 列表。

更多信息请参阅 View a specific ruleset

更新规则

使用 Update a zone ruleset rule 操作。

你需要提供 ruleset ID 与规则 ID。要获取这些 ID,可使用 Get a zone entry point ruleset 操作并指定 http_ratelimit 阶段名称。

更多信息请参阅 Update a rule in a ruleset

删除规则

使用 Delete a zone ruleset rule 操作。

你需要提供 ruleset ID 与规则 ID。要获取这些 ID,可使用 Get a zone entry point ruleset 操作并指定 http_ratelimit 阶段名称。

更多信息请参阅 Delete a rule in a ruleset

这些操作在 Ruleset Engine 文档中均有介绍。Ruleset Engine 为包括 rate limiting rules 在内的多个 Cloudflare 产品提供支持。

更多资源

有关通过 API 在账户级别部署速率限制规则的说明,请参阅 通过 API 创建速率限制规则集

这篇文档对您有帮助吗?