You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 使用Filter的更新端点:PUT /zones/{zone_identifier}/filters/{filter_id}
  2. 构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:34:59