

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

# 为应用程序负载均衡器添加侦听器规则
<a name="add-rule"></a>

创建侦听器时，您会定义一条默认规则。您可以随时定义其他规则。每条规则都必须指定一个操作和一个条件，并且可以选择指定转换。有关更多信息，请参阅下列内容：
+ [操作类型](rule-action-types.md)
+ [条件类型](rule-condition-types.md)
+ [转换](rule-transforms.md)

------
#### [ Console ]

**添加一项规则**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.amazonaws.cn/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择负载均衡器。

1. 在**侦听器和规则**选项卡上，选择**协议：端口**列中的文本以打开侦听器的详细信息页面。

1. 在**规则**选项卡上，选择**添加规则**。

1. （可选）要为规则指定名称，请展开**名称和标签**，然后输入名称。要添加其他标签，请选择**添加其他标签**，然后输入标签键和标签值。

1. 对于每个条件，选择**添加条件**，选择条件类型，然后提供所需的条件值：
   + **主机标头**：选择匹配模式类型并输入主机标头。

     **值匹配**：最多 128 个字符。不区分大小写。允许的字符是 a-z、A-Z、0-9；以下特殊字符：-\$1.；以及通配符（\$1 和 ?）。您必须包含至少一个“.”字符。在最后一个“.”字符之后只能包含字母数字字符。

     **正则表达式匹配**：最多 128 个字符。
   + **路径**：选择匹配模式类型并输入路径。

     **值匹配**：最多 128 个字符。区分大小写。允许的字符是 a-z、A-Z、0-9；以下特殊字符：\$1-.\$1/\$1"'@:\$1；&；以及通配符（\$1 和 ?）。

     **正则表达式匹配**：最多 128 个字符。
   + **查询字符串**：输入键值对或不带键的值。

     最多 128 个字符。不区分大小写。允许的字符为 a-z、A-Z、0-9；以下特殊字符：\$1-.\$1/\$1"'@:\$1&()\$1,;=；以及通配符（\$1 和 ?）。
   + **HTTP 请求方法**：输入 HTTP 请求方法。

     最多 40 个字符。区分大小写。允许的字符为 A-Z，以及以下特殊字符：-\$1。不支持通配符。
   + **HTTP 标头**：选择匹配模式类型，然后输入标头名称和比较字符串。
     + **HTTP 标头名称**– 规则将评估包含此标头的请求以确认匹配值。

       **值匹配**：最多 40 个字符。不区分大小写。允许的字符是 a-z、A-Z、0-9 和以下特殊字符：\$1?-\$1\$1\$1%&'\$1.^\$1`\$1\$1。不支持通配符。

       **正则表达式匹配**：最多 128 个字符。
     + **HTTP 标头值** – 输入要与 HTTP 标头值进行比较的字符串。

       **值匹配**：最多 128 个字符。不区分大小写。允许的字符为 a-z、A-Z、0-9；空格；以下特殊字符：\$1"\$1\$1%&'()\$1,./:;<=>@[]^\$1`\$1\$1\$1\$1-；以及通配符（\$1 和 ?）。

       **正则表达式匹配**：最多 128 个字符。
   + **源 IP** – 以 CIDR 格式定义源 IP 地址。两 IPv4 者 IPv6 CIDRs 都允许。不支持通配符。

1. （可选）要添加转换，请选择**添加转换**，选择转换类型，然后输入要匹配的正则表达式和替换字符串。

1. （可选，仅限 HTTPS 侦听器）对于**预路由操作**，请选择以下操作之一：
   + **对用户进行身份验证**-选择身份提供者并提供所需的信息。有关更多信息，请参阅 [使用 Application Load Balancer 验证用户身份](listener-authenticate-users.md)。
   + **验证令牌**-输入 JWKS 端点、问题和任何其他声明。有关更多信息，请参阅 [JWTs 使用 Application Load Balancer 进行验证](listener-verify-jwt.md)。

1. 对于 “**路由操作**”，请选择以下操作之一：
   + **转发到目标组**：选择一个目标组。要添加其他目标组，请选择**添加目标组**，然后选择一个目标组，检查相对权重并根据需要更新权重。如果在任何目标组上启用了粘性，则必须启用组级粘性。
   + **重定向到 URL**：在 **URI 部分**选项卡上分别输入每个部分，或者在**完整 URL**选项卡上输入完整的地址，从而输入 URL。对于**状态代码**，根据您的需求选择临时（HTTP 302）或永久（HTTP 301）。
   + **返回固定响应**：输入要为已删除的客户端请求返回的**响应代码**。您也可以指定**内容类型**和**响应正文**。

1. 选择**下一步**。

1. 对于**优先级**，输入一个介于 1 至 50000 之间的值。规则是按优先级顺序（从最低值到最高值）评估的。

1. 选择**下一步**。

1. 在**审核和创建**页面，选择**创建**。

------
#### [ Amazon CLI ]

**添加一项规则**  
使用 [create-rule](https://docs.amazonaws.cn/cli/latest/reference/elbv2/create-rule.html) 命令。

以下示例创建了一条具有 `forward` 操作和 `host-header` 条件的规则。

```
aws elbv2 create-rule \
    --listener-arn listener-arn \
    --priority 10 \
    --conditions "Field=host-header,Values=example.com,www.example.com" \
    --actions "Type=forward,TargetGroupArn=target-group-arn"
```

要创建转发操作以在两个目标组之间分配流量，请改用以下 `--actions` 选项。

```
    --actions '[{
        "Type":"forward",
        "ForwardConfig":{
          "TargetGroups":[
            {"TargetGroupArn":"target-group-1-arn","Weight":50},
            {"TargetGroupArn":"target-group-2-arn","Weight":50}
          ]
        }
    }]'
```

以下示例创建了一条具有 `fixed-response` 操作和 `source-ip` 条件的规则。

```
aws elbv2 create-rule \
    --listener-arn listener-arn \
    --priority 20 \
    --conditions '[{"Field":"source-ip","SourceIpConfig":{"Values":["192.168.1.0/24","10.0.0.0/16"]}}]' \
    --actions "Type=fixed-response,FixedResponseConfig={StatusCode=403,ContentType=text/plain,MessageBody='Access denied'}"
```

以下示例创建了一条具有 `redirect` 操作和 `http-header` 条件的规则。

```
aws elbv2 create-rule \
    --listener-arn listener-arn \
    --priority 30 \
    --conditions '[{"Field":"http-header","HttpHeaderConfig":{"HttpHeaderName":"User-Agent","Values":["*Mobile*","*Android*","*iPhone*"]}}]' \
    --actions "Type=redirect,RedirectConfig={Host=m.example.com,StatusCode=HTTP_302}"
```

------
#### [ CloudFormation ]

**添加一项规则**  
定义类型的资源[AWS::ElasticLoadBalancingV2::ListenerRule](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listenerrule.html)。

以下示例创建了一条具有 `forward` 操作和 `host-header` 条件的规则。满足条件时，该规则会将流量发送到指定的目标组。

```
Resources:
    myForwardListenerRule:
     Type: 'AWS::ElasticLoadBalancingV2::ListenerRule'
     Properties:
       ListenerArn: !Ref myListener
       Priority: 10
       Conditions:
         - Field: host-header
           Values:
             - example.com
             - www.example.com
       Actions:
         - Type: forward
           TargetGroupArn: !Ref myTargetGroup
```

或者，要创建在满足条件时在两个目标组之间分配流量的转发操作，请按以下方式定义 `Actions`。

```
       Actions:
         - Type: forward
           ForwardConfig:
             TargetGroups:
               - TargetGroupArn: !Ref TargetGroup1
                 Weight: 50
               - TargetGroupArn: !Ref TargetGroup2
                 Weight: 50
```

以下示例创建了一条具有 `fixed-response` 操作和 `source-ip` 条件的规则。

```
Resources:
    myFixedResponseListenerRule:
     Type: 'AWS::ElasticLoadBalancingV2::ListenerRule'
     Properties:
       ListenerArn: !Ref myListener
       Priority: 20
       Conditions:
         - Field: source-ip
           SourceIpConfig:
             Values:
                - 192.168.1.0/24
                - 10.0.0.0/16
       Actions:
         - Type: fixed-response
           FixedResponseConfig:
             StatusCode: 403
             ContentType: text/plain
             MessageBody: "Access denied"
```

以下示例创建了一条具有 `redirect` 操作和 `http-header` 条件的规则。

```
Resources:
    myRedirectListenerRule:
     Type: 'AWS::ElasticLoadBalancingV2::ListenerRule'
     Properties:
       ListenerArn: !Ref myListener
       Priority: 30
       Conditions:
         - Field: http-header
           HttpHeaderConfig:
             HttpHeaderName: User-Agent
             Values: 
               - "*Mobile*"
               - "*Android*"
               - "*iPhone*"
       Actions:
         - Type: redirect
           RedirectConfig:
             Host: m.example.com
             StatusCode: HTTP_302
```

------