

**引入全新的主机体验 Amazon WAF**

现在，您可以使用更新的体验访问控制台中任意位置的 Amazon WAF 功能。有关更多详细信息，请参阅[使用控制台](https://docs.amazonaws.cn/waf/latest/developerguide/working-with-console.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 动态标签插值
<a name="waf-dynamic-label-interpolation"></a>

动态标签插值允许您使用`${namespace:}`语法将标签值直接嵌入到自定义请求标头、自定义响应标头和自定义响应正文中。 Amazon WAF 在评估时会根据附加到请求的标签解析每个占位符，因此您不必为每个标签值编写单独的规则。

插值可在现有 Amazon WAF API 中运行，无需新字段或配置步骤。您可以在现有字符串值中使用占位符语法。现有的静态标头值继续保持不变。只有当值包含子句时，插值才会激活。`${namespace:}`

## 支持插值的地方
<a name="waf-interpolation-where-supported"></a>

可以在以下`${namespace:}`位置使用插值：
+ **自定义请求标头**-将已解析的标签值插入到转发到您的源的标头中。使用标题值字段中的`${namespace:}`语法。
+ **自定义响应正**文-在区块页面、挑战页面和其他自定义响应中嵌入标签值和合成标签。使用响应正文内容字段中的`${namespace:}`语法。
+ **自定义响应标头**-在响应标头中插入标签值，例如在重定向`Location`标头中。使用响应标头值字段中的`${namespace:}`语法。

## 插值语法和分辨率
<a name="waf-interpolation-syntax"></a>

要使用插值，请在标头值或自定义响应正文内容中包含`${namespace:}`子句。结尾的冒号很重要。它告诉 Amazon WAF 要解析该命名空间中的所有标签，而不是从字面上匹配单个标签。

Amazon WAF 使用以下规则在评估时解析每个子句：

1. **单标签匹配** — 该子句解析为标签的终端值。例如，如果请求有标签`awswaf:managed:aws:bot-control:bot:category:scraping`，则该子句`${awswaf:managed:aws:bot-control:bot:category:}`解析为。`scraping`

1. **多个标签**-当多个标签与命名空间匹配时，值将以逗号分隔的列表形式返回，并去除命名空间前缀。例如 `scraping,advertising`。

1. **不匹配** — 该子句解析为空字符串。

**注意**  
单个字符串值最多支持 10 个`${namespace:}`占位符。如果一个值包含 10 个以上的占位符，则 Amazon WAF 解析前 10 个占位符，并将所有其他占位符作为文字文本保留在输出中。`${namespace:}`此限制适用于每个字符串值，而不适用于每个请求。在多个标题中，每个标题中最多可以使用 10 个占位符，不会出现问题。

**重要**  
自定义标签在中使用短名称`ruleLabels`。例如 `app:tier:enterprise`。但是， Amazon WAF 会自动在短名称前加上保护包 (Web ACL) 上下文，从而生成完全限定的标签。例如 `awswaf:{{ACCOUNT_ID}}:webacl:{{WEBACL_NAME}}:app:tier:enterprise`。label match 语句适用于短命名空间，但插值引用必须始终使用完全限定的命名空间。

## 合成标签
<a name="waf-interpolation-synthetic-labels"></a>

插值还支持合成标签。这些是从请求上下文而不是标签存储中 Amazon WAF 解析的内置值。可以在同一个值字符串中将合成标签和基于命名空间的标签组合在一起。


| 合成标签 | 说明 | 
| --- | --- | 
| ${awswaf:request\_id:} | 唯一的 Amazon WAF 请求标识符。 | 
| ${awswaf:ip:} | 客户端 IP 地址。 | 
| ${awswaf:ja3:} | JA3 TLS 指纹。 | 
| ${awswaf:ja4:} | JA4 TLS 指纹。 | 

## 动态标签插值示例
<a name="waf-interpolation-examples"></a>

**使用动态标头发送应用程序信号**  
以下规则将多个 Bot Control 信号命名空间作为单独的标题转发到您的源。一条规则涵盖整个命名空间，因此当托管规则组添加新标签时，您无需更新规则。

```
{
  "Name": "forward-waf-signals",
  "Statement": {
    "LabelMatchStatement": {
      "Scope": "NAMESPACE",
      "Key": "awswaf:managed:aws:bot-control:bot:category:"
    }
  },
  "RuleAction": {
    "Count": {
      "CustomRequestHandling": {
        "InsertHeaders": [
          { "Name": "bot-category",
            "Value": "${awswaf:managed:aws:bot-control:bot:category:}" },
          { "Name": "bot-name",
            "Value": "${awswaf:managed:aws:bot-control:bot:name:}" },
          { "Name": "bot-signals",
            "Value": "${awswaf:managed:aws:bot-control:signal:}" },
          { "Name": "client-ip",
            "Value": "${awswaf:ip:}" }
        ]
      }
    }
  }
}
```

`bot-signals`标题（输出:`x-amzn-waf-bot-signals`）演示了多值分辨率。例如，`signal:`命名空间可能包含多个标签`non_browser_user_agent,automated_browser`，这些标签解析为逗号分隔的列表。`client-ip`标题（输出:`x-amzn-waf-client-ip`）使用合成标签。

**包含调试信息的自定义区块页面**  
合成标签允许您构建包含特定请求上下文的区块页面。将客户的 IP 地址和 Amazon WAF 请求 ID 直接嵌入到响应正文中，以便在用户报告误报时向他们提供一些可以分享的内容。

```
{
  "CustomResponseBodies": {
    "BlockPage": {
      "Content": "Your request was blocked.\n\nIP: ${awswaf:ip:}\nRequest ID: ${awswaf:request_id:}\n\nIf you believe this is an error, contact support with the Request ID above.",
      "ContentType": "TEXT_PLAIN"
    }
  }
}
```

**自定义标签插值**  
插值适用于任何标签命名空间，包括您在自己的规则中定义的自定义标签。以下示例按照 API 密钥对请求进行分类，并将等级值转发给源。

**规则 1：根据 API 密钥对等级进行分类**  
此规则将请求与企业 API 密钥进行匹配并应用自定义标签。

```
{
{
  "Name": "classify-tier",
  "Priority": 100,
  "Statement": {
    "ByteMatchStatement": {
      "SearchString": "pk_enterprise_",
      "FieldToMatch": { "SingleHeader": { "Name": "x-api-key" } },
      "PositionalConstraint": "STARTS_WITH",
      "TextTransformations": [{ "Priority": 0, "Type": "NONE" }]
    }
  },
  "RuleLabels": [{ "Name": "app:tier:enterprise" }],
  "Action": { "Count": {} }
}

}
```

**规则 2：转发已解决的等级值**  
此规则匹配`app:tier`命名空间中的任何标签，并将已解析的值作为标题转发。

```
{
{
  "Name": "forward-tier",
  "Priority": 200,
  "Statement": {
    "LabelMatchStatement": {
      "Scope": "NAMESPACE",
      "Key": "app:tier:"
    }
  },
  "Action": {
    "Count": {
      "CustomRequestHandling": {
        "InsertHeaders": [{
          "Name": "customer-tier",
          "Value": "${awswaf:{{ACCOUNT_ID}}:webacl:{{WEBACL_NAME}}:app:tier:}"
        }]
      }
    }
  }
}
```

第一条规则应用标签`app:tier:enterprise`。第二条规则匹配`app:tier`命名空间中的任何标签，并将已解析的值作为`customer-tier`标题转发。输出标头名称为`x-amzn-waf-customer-tier`。您可以为其他等级添加更多分类规则，例如`app:tier:standard`或`app:tier:trial`。转发规则在不做任何更改的情况下接收它们。

有关演示所有这些模式的可部署示例，请参阅上的 “[Amazon WAF 动态标签插值](https://github.com/aws-samples/sample-aws-waf-dynamic-labels)” 示例。 GitHub