Cloudflare API更新WAF规则表达式失败问题求助
Cloudflare WAF规则更新问题:表达式无法修改但API返回成功
我使用Cloudflare API更新WAF规则时,所有凭证均验证正确,当前代码可成功修改规则名称与action,但无法更新filter的expression。尝试了两种请求结构体,API均返回成功,但表达式未实际变更,相关信息如下:
原代码片段
$zoneIdentifier = "123"; //实际凭证已多次验证正确 $authKey = "123"; //实际凭证已多次验证正确 $accountID = "123"; //实际凭证已多次验证正确 $ruleId = "123"; //实际凭证已多次验证正确 $filerID = "123"; //实际凭证已多次验证正确 $url = "https://api.cloudflare.com/client/v4/zones/{$zoneIdentifier}/firewall/rules/{$ruleId}"; $headers = [ "X-Auth-Email: myemail@myemail.com", "X-Auth-Key: {$authKey}", "Content-Type: application/json", ]; // cURL请求函数 function makeCurlRequest($url, $headers, $method = "GET", $data = null) { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => $data ? json_encode($data) : null, CURLOPT_HTTPHEADER => $headers, ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; return false; } return json_decode($response, true); } // 获取规则信息 $responseData = makeCurlRequest($url, $headers); if ($responseData !== false) { // 处理响应 $filter = $responseData['result']['filter']; $expression = $filter['expression']; // 要添加的新IP $newIpAddress = "123.123.1.0"; //测试IP // 构造新的过滤表达式 $newFilterExpression = "(ip.src eq {$newIpAddress})"; // 如果已有表达式,用or拼接 if ($expression) { $newFilterExpression = "{$expression} or {$newFilterExpression}"; } // 更新规则的结构体 $updatedRule = [ "id" => $ruleId, "paused" => false, "description" => "BlockBadIP", "action" => "block", "expression" => $newFilterExpression ]; // 更新请求URL $updateUrl = "https://api.cloudflare.com/client/v4/zones/{$zoneIdentifier}/firewall/rules/{$ruleId}"; // 发送PUT请求更新规则 $updateResponse = makeCurlRequest($updateUrl, $headers, "PUT", $updatedRule); if ($updateResponse !== false) { // 输出响应(原代码未实现) } else { echo "Update failed."; } } else { echo "Failed to retrieve rule information."; }
尝试过的两种更新结构体
结构体1
$updatedRule = [ "id" => $ruleId, "paused" => false, "description" => "BlockBadIP", "action" => "block", "expression" => $newFilterExpression ];
结构体2
$updatedRule = [ "id" => $ruleId, "paused" => false, "description" => "BlockBadIP", "action" => "block", "filter" => [ "id" => $filerID, "expression" => $newFilterExpression ], ];
API响应信息
["success"]=> bool(true) ["errors"]=> array(0) { } ["messages"]=> array(0)
问题原因及解决方法
核心原因
Cloudflare的Firewall Rule(防火墙规则)和Filter(过滤条件)是独立的资源:
- Firewall Rule仅负责关联Filter的ID,并定义规则的action、描述等属性
- 更新Firewall Rule时,即使传入
expression或包含expression的filter对象,API只会验证关联的Filter ID有效性,不会修改Filter本身的内容,因此返回成功但表达式无变化
正确解决方案
需要直接调用Filter的更新API来修改表达式,而不是更新Firewall Rule:
- 使用Filter的更新端点:
PUT /zones/{zone_identifier}/filters/{filter_id} - 构造Filter的更新数据,仅传入
expression字段即可(无需其他冗余字段)
修改后的代码示例
在原代码中,替换更新规则的部分为以下内容:
// 构造Filter更新数据 $updatedFilter = [ "expression" => $newFilterExpression ]; // Filter更新API的URL $filterUpdateUrl = "https://api.cloudflare.com/client/v4/zones/{$zoneIdentifier}/filters/{$filerID}"; // 发送PUT请求更新Filter $filterUpdateResponse = makeCurlRequest($filterUpdateUrl, $headers, "PUT", $updatedFilter); if ($filterUpdateResponse !== false) { if ($filterUpdateResponse['success']) { echo "Filter expression updated successfully."; } else { echo "Update failed: " . print_r($filterUpdateResponse['errors'], true); } } else { echo "Filter update request failed."; }
内容的提问来源于stack exchange,提问作者CharlieT
相关产品推荐
相关产品推荐

