

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

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

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

# 发送 Block 操作的自定义响应
<a name="customizing-the-response-for-blocked-requests"></a>

本节介绍如何指示 AWS WAF 将设置为的规则操作或保护包 (Web ACL) 默认操作的自定义 HTTP 响应发送回客户端。Block有关规则操作的更多信息，请参阅 [在中使用规则操作 AWS WAF](waf-rule-action.md)。有关默认保护包（web ACL）操作的更多信息，请参阅 [在中设置保护包 (Web ACL) 的默认操作 AWS WAF](web-acl-default-action.md)。

在为 Block 操作定义自定义响应处理时，您可以定义状态代码、标头和响应正文。有关可与配合使用的状态代码列表 AWS WAF，请参阅以下部分[自定义响应支持的状态码](customizing-the-response-status-codes.md)。

**使用案例**  
自定义响应的使用案例包括：
+ 将默认状态码发送回客户端。
+ 将自定义响应标头发送回客户端。您可以为指定任何标头名称，除 `content-type` 外。
+ 将静态错误页面发送回客户端。
+ 将客户端重定向到其他 URL。为此，您需要指定一个 `3xx` 重定向状态码，例如 `301 (Moved Permanently)` 或 `302 (Found)`，然后以新 URL 指定一个名为 `Location` 的新标头。

**与您在受保护资源中定义的响应进行交互**  
您为 AWS WAF Block操作指定的自定义响应优先于您在受保护资源中定义的任何响应规范。

您保护的 AWS 资源的主机服务 AWS WAF 可能允许对 Web 请求进行自定义响应处理。示例包括：
+ 借助 Amazon CloudFront，您可以根据状态代码自定义错误页面。有关信息，请参阅《*Amazon CloudFront 开发者指南》*中的[生成自定义错误响应](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GeneratingCustomErrorResponses.html)。
+ 使用 Amazon API Gateway，您可以为网关定义响应和状态码。有关更多信息，请参阅 *Amazon API Gateway 开发人员指南*中的 [API Gateway 中的 Gateway 响应](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gatewayResponse-definition.html)。

在受保护的 AWS 资源中，您不能将 AWS WAF 自定义响应设置与自定义响应设置结合使用。任何单个 web 请求的响应规范要么完全来自 AWS WAF ，要么完全来自受保护的资源。

对于 AWS WAF 阻塞的 Web 请求，以下显示了优先顺序。

1. **AWS WAF 自定义响应**-如果 AWS WAF Block操作启用了自定义响应，则受保护的资源会将配置的自定义响应发送回客户端。您在受保护的资源中定义的任何响应设置（如有）均无效。

1. **在受保护资源中定义的自定义响应**：否则，如果受保护资源有指定的自定义响应设置，则受保护资源将使用这些设置来响应客户端。

1. **AWS WAF 默认Block响应**-否则，受保护的资源将使用 AWS WAF 默认响应来Block响应客户端`403 (Forbidden)`。

对于 AWS WAF 允许的 Web 请求，您对受保护资源的配置决定了它发送回客户端的响应。您无法在中 AWS WAF 为允许的请求配置响应设置。您可以 AWS WAF 为允许的请求配置的唯一自定义是在原始请求中插入自定义标头，然后再将请求转发到受保护的资源。上一节 [为非阻止操作插入自定义请求标头](customizing-the-incoming-request.md) 中介绍了此选项。

**自定义响应标头**  
您可以为指定任何标头名称，除 `content-type` 外。

**自定义响应正文**  
您可以在要使用的保护包（web ACL）或规则组的上下文中定义自定义响应的正文。定义自定义响应正文后，您可以在保护包（web ACL）或创建它的规则组中任何其他位置通过引用来使用它。在单个 Block 操作设置中，您可以引用要使用的自定义正文，并定义自定义响应的状态代码和标头。

在控制台中创建自定义响应时，您可以从已定义的响应正文中进行选择，也可以创建新的响应正文。在控制台之外，您可以在保护包（web ACL）或规则组级别定义自定义响应正文，然后从 保护包（web ACL）或规则组中的操作设置中进行引用。这在下一节的 JSON 示例中有所体现。

**自定义响应示例**  
以下示例列出了具有自定义响应设置的规则组的 JSON。为整个规则组定义自定义响应正文，然后由规则操作中的键来引用。

```
{
 "ARN": "test_rulegroup_arn",
 "Capacity": 1,
 
 "CustomResponseBodies": {
  "CustomResponseBodyKey1": {
   "Content": "This is a plain text response body.",
   "ContentType": "TEXT_PLAIN"
  }
 },
 
 "Description": "This is a test rule group.",
 "Id": "test_rulegroup_id",
 "Name": "TestRuleGroup",
 
 "Rules": [
  {
   "Action": {
    "Block": {
     "CustomResponse": {
      "CustomResponseBodyKey": "CustomResponseBodyKey1",
      "ResponseCode": 404,
      "ResponseHeaders": [
       {
        "Name": "BlockActionHeader1Name",
        "Value": "BlockActionHeader1Value"
       }
      ]
     }
    }
   },
   "Name": "GeoMatchRule",
   "Priority": 1,
   "Statement": {
    "GeoMatchStatement": {
     "CountryCodes": [
      "US"
     ]
    }
   },
   "VisibilityConfig": {
    "CloudWatchMetricsEnabled": true,
    "MetricName": "TestRuleGroupReferenceMetric",
    "SampledRequestsEnabled": true
   }
  }
 ],
 "VisibilityConfig": {
  "CloudWatchMetricsEnabled": true,
  "MetricName": "TestRuleGroupMetric",
  "SampledRequestsEnabled": true
 }
}
```