## 全网 URL 防护设置 (`url-guard-settings`)

平台级全网 URL 防护的缺省开关与阈值,仅管理员可改;站点各自的开关与阈值在站点安全配置里。

鉴权: 仅管理员 · 文档: https://www-demo.kuxitong.com/zh/docs/api/url-guard-settings

### GET `/api/v2/url-guard-settings`

获取全网 URL 防护设置 · 鉴权: 仅管理员

```sh
curl "https://panel.example.com/api/v2/url-guard-settings" \
  -H "X-API-Key: $GOCDN_API_KEY"
```

### PUT `/api/v2/url-guard-settings`

修改全网 URL 防护设置 · 鉴权: 仅管理员

请求体:

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `action` | string | 有 | 触发后对该 URL 的动作:挑战验证、拦截、每 IP 限速。 可选值: ["challenge","block","limit"] |
| `baseline_ratio` | integer |  | 触发还须达到平时的这么多倍(平时 = 该 URL 过去 1 小时的平均 QPS,不含最近 1 分钟);面板最小填 1,缺省 5;0 = 不看倍数(旧配置没有该字段,按 0 沿用原判定)。只管新触发,已在途规则续期只看 QPS。修改时不带则保持原值。 |
| `enabled` | boolean | 有 | 全局默认开关;站点未单独设置时按它。 |
| `expected_updated_at` | string |  | 乐观锁:调用方读到的 updated_at(读到为空用 1970-01-01T00:00:00Z)。与库里当前值不等则回 409 stale_version、不保存;不带则不检查。 |
| `gate` | string |  | WAF 增强(waf_enhanced)判定档:full 开通、readonly 到期只读缓冲内(License.readonly_days,缺省 7 天;照常生效、设置只读)、basic 未开通或已回落(不下发);修改时忽略。 可选值: ["full","readonly","basic"] |
| `gate_expired_at` | string |  | 仅管理员响应且 gate_reason=expired 时带:平台 WAF 增强授权的到期时刻;租户响应不带。 |
| `gate_owner` | WafGateOwner |  | 站点属主,仅管理员响应带;租户响应不带别人的信息。 |
| `gate_packages` | string[] |  | 仅管理员响应带:属主名下未到期的套餐名(最多 20 个);租户响应不带。 |
| `gate_reason` | WafGateReason |  | WAF 增强(waf_enhanced)没生效的原因,gate 为 full 或 readonly 时不带。package = 平台已授权但属主没有未到期且含 WAF 增强的套餐;license = 平台没开通(从未授权、服务商撤销、授权被停用);expired = 平台授权已到期且只读缓冲期(License.readonly_days,缺省 7 天)已过,已回落基础。 可选值: ["package","license","expired"] |
| `hold_s` | integer | 有 | 规则保持秒数;到期前仍超阈会自动续期,降下来就到期撤销。 |
| `kind` | string |  | action=challenge 的挑战类型,缺省 js;其它动作须为空。 可选值: ["js","redirect","delay_jump","cookie","captcha","slide","click","rotate"] |
| `max_per_site` | integer | 有 | 同一站点同时生效的规则条数上限。 |
| `qps` | integer | 有 | 某 URL 全网合计 QPS 不低于它(且达到平时的 baseline_ratio 倍)才触发。 |
| `rate` | integer |  | action=limit 的每 IP 每 10 秒最多请求数;其它动作须为 0。 |
| `updated_at` | string |  | 响应里的版本(没改过为空);修改时忽略,乐观锁用 expected_updated_at。 |

```sh
curl -X PUT "https://panel.example.com/api/v2/url-guard-settings" \
  -H "X-API-Key: $GOCDN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"challenge","baseline_ratio":5,"enabled":true,"hold_s":600,"kind":"js","max_per_site":20,"qps":300,"rate":20}'
```

全网 URL 防护设置对象:

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `action` | string |  | 触发后对该 URL 的动作:挑战验证、拦截、每 IP 限速。 可选值: ["challenge","block","limit"] |
| `baseline_ratio` | integer |  | 触发还须达到平时的这么多倍(平时 = 该 URL 过去 1 小时的平均 QPS,不含最近 1 分钟);面板最小填 1,缺省 5;0 = 不看倍数(旧配置没有该字段,按 0 沿用原判定)。只管新触发,已在途规则续期只看 QPS。修改时不带则保持原值。 |
| `enabled` | boolean |  | 全局默认开关;站点未单独设置时按它。 |
| `expected_updated_at` | string |  | 乐观锁:调用方读到的 updated_at(读到为空用 1970-01-01T00:00:00Z)。与库里当前值不等则回 409 stale_version、不保存;不带则不检查。 |
| `gate` | string |  | WAF 增强(waf_enhanced)判定档:full 开通、readonly 到期只读缓冲内(License.readonly_days,缺省 7 天;照常生效、设置只读)、basic 未开通或已回落(不下发);修改时忽略。 可选值: ["full","readonly","basic"] (只读) |
| `gate_expired_at` | string |  | 仅管理员响应且 gate_reason=expired 时带:平台 WAF 增强授权的到期时刻;租户响应不带。 (只读) |
| `gate_owner` | WafGateOwner |  | 站点属主,仅管理员响应带;租户响应不带别人的信息。 (只读) |
| `gate_packages` | string[] |  | 仅管理员响应带:属主名下未到期的套餐名(最多 20 个);租户响应不带。 (只读) |
| `gate_reason` | WafGateReason |  | WAF 增强(waf_enhanced)没生效的原因,gate 为 full 或 readonly 时不带。package = 平台已授权但属主没有未到期且含 WAF 增强的套餐;license = 平台没开通(从未授权、服务商撤销、授权被停用);expired = 平台授权已到期且只读缓冲期(License.readonly_days,缺省 7 天)已过,已回落基础。 可选值: ["package","license","expired"] (只读) |
| `hold_s` | integer |  | 规则保持秒数;到期前仍超阈会自动续期,降下来就到期撤销。 |
| `kind` | string |  | action=challenge 的挑战类型,缺省 js;其它动作须为空。 可选值: ["js","redirect","delay_jump","cookie","captcha","slide","click","rotate"] |
| `max_per_site` | integer |  | 同一站点同时生效的规则条数上限。 |
| `qps` | integer |  | 某 URL 全网合计 QPS 不低于它(且达到平时的 baseline_ratio 倍)才触发。 |
| `rate` | integer |  | action=limit 的每 IP 每 10 秒最多请求数;其它动作须为 0。 |
| `updated_at` | string |  | 响应里的版本(没改过为空);修改时忽略,乐观锁用 expected_updated_at。 (只读) |
