

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

# 侦听器规则的条件类型
<a name="rule-condition-types"></a>

条件定义了要使侦听器规则生效，传入的请求必须满足的条件。如果请求满足规则的条件，则将按照规则操作指定的方式处理该请求。每个规则条件都有类型和配置信息。应用程序负载均衡器支持侦听器规则的以下条件类型。条件类型

`host-header`  
基于每个请求的主机名进行路由。有关更多信息，请参阅 [主机条件](#host-conditions)。

`http-header`  
基于每个请求的 HTTP 标头进行路由。有关更多信息，请参阅 [HTTP 标头条件](#http-header-conditions)。

`http-request-method`  
基于每个请求的 HTTP 请求方法路由。有关更多信息，请参阅 [HTTP 请求方法条件](#http-request-method-conditions)。

`path-pattern`  
基于请求中的路径模式进行路由 URLs。有关更多信息，请参阅 [路径条件](#path-conditions)。

`query-string`  
根据查询字符串中的 key/value 成对或值进行路由。有关更多信息，请参阅 [查询字符串条件](#query-string-conditions)。

`source-ip`  
基于每个请求的源 IP 地址进行路由。有关更多信息，请参阅 [源 IP 地址条件](#source-ip-conditions)。

**条件基础知识**
+ 每个规则可以选择没有条件，也可包含以下条件之一：`host-header`、`http-request-method`、`path-pattern` 和 `source-ip`。每个规则还可以包含以下每个条件中的零个或多个：`http-header` 和 `query-string`。
+ 使用 `host-header`、`http-header` 和 `path-pattern` 条件时，您可以使用值匹配，也可以使用正则表达式（regex）匹配方法。
+ 您可以为每个条件指定最多三个匹配评估。例如，对于每个 `http-header` 条件，您最多可以指定三个字符串，以与请求中的 HTTP 标头的值进行比较。如果其中一个字符串与 HTTP 标头的值匹配，则满足条件。若要要求所有字符串都匹配，请为每个匹配评估创建一个条件。
+ 您可以为每条规则指定最多五个匹配评估。例如，您可以创建一个具有五个条件的规则，其中每个条件都有一个匹配评估。
+ 您可以在 `http-header`、`host-header`、`path-pattern` 和 `query-string` 条件的匹配评估中包含通配符。每条规则的通配符上限为五个。
+ 规则仅应用于可见的 ASCII 字符；不包括控制字符（0x00 到 0x1f 和 0x7f）。
+ 规则条件中使用的正则表达式不支持以下功能：lookheads、lookbehind、反向引用、原子组、所有格量词、子例程、递归和 Unicode 字符类（例如）。`\p{L}`

**演示**  
有关演示，请参阅[高级请求路由](https://exampleloadbalancer.com/advanced_request_routing_demo.html)。

## 主机条件
<a name="host-conditions"></a>

您可以使用主机条件来定义基于主机标头中的主机名路由请求的规则（也称为*基于主机的路由*）。这使您能够使用单个负载均衡器支持多个子域和不同的顶级域。

主机名不区分大小写，长度上限为 128 个字符，并且可包含以下任何字符：
+ A-Z、a-z、0-9
+ - .
+ \$1（匹配 0 个或多个字符）
+ ?（完全匹配 1 个字符）

您必须包含至少一个“.”字符。在最后一个“.”字符之后只能包含字母数字字符。

**主机名示例**
+ example.com
+ test.example.com
+ \$1.example.com

规则 \$1.example.com 与 test.example.com 匹配，但与 example.com 不匹配。

**Example 主机标头条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。  

```
[
  {
      "Field": "host-header",
      "HostHeaderConfig": {
          "Values": ["*.example.com"]
      }
  }
]
```

```
[
  {
      "Field": "host-header",
      "HostHeaderConfig": {
          "RegexValues": ["^(.*)\\.example\\.com$"]
      }
  }
]
```

## HTTP 标头条件
<a name="http-header-conditions"></a>

您可以使用 HTTP 标头条件来配置基于请求的 HTTP 标头路由请求的规则。您可以指定标准或自定义 HTTP 标头字段的名称。标头名称和匹配评估不区分大小写。比较字符串支持以下通配符：\$1（匹配 0 个或多个字符）和 ?（完全匹配 1 个字符）。标头名称不支持通配符。

启用应用程序负载均衡器属性 `routing.http.drop_invalid_header_fields` 后，将会丢弃不符合正则表达式 (`A-Z,a-z,0-9`) 的标头名称。也可以添加不符合正则表达式的标头名称。

**Example HTTP 标头条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。具有与指定字符串之一匹配的 User-Agent 标头的请求满足以下条件。  

```
[
  {
      "Field": "http-header",
      "HttpHeaderConfig": {
          "HttpHeaderName": "User-Agent",
          "Values": ["*Chrome*", "*Safari*"]
      }
  }
]
```

```
[
  {
      "Field": "http-header",
      "HttpHeaderConfig": {
          "HttpHeaderName": "User-Agent",
          "RegexValues": [".+"]
      }
  }
]
```

## HTTP 请求方法条件
<a name="http-request-method-conditions"></a>

您可以使用 HTTP 请求方法条件来配置基于请求的 HTTP 请求方法路由请求的规则。您可以指定标准或自定义 HTTP 方法。匹配评估区分大小写。不支持通配符；因此，方法名称必须完全匹配。

我们建议您以相同的方式路由 GET 和 HEAD 请求，因为这样可以缓存对 HEAD 请求的响应。

**Example HTTP 方法条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。使用指定方法的请求满足以下条件。  

```
[
  {
      "Field": "http-request-method",
      "HttpRequestMethodConfig": {
          "Values": ["CUSTOM-METHOD"]
      }
  }
]
```

## 路径条件
<a name="path-conditions"></a>

您可以使用路径条件来定义基于请求中的 URL 路由请求的规则（也称为*基于路径的路由*）。

路径模式仅应用于 URL 的路径，而不应用于其查询参数。它仅应用于可见的 ASCII 字符；不包括控制字符（0x00 到 0x1f 和 0x7f）。

仅当 URI 规范化之后才执行规则评估。

路径模式区分大小写，长度最多为 128 个字符，并且可包含以下任何字符。
+ A-Z、a-z、0-9
+ \$1 - . \$1 / \$1 " ' @ : \$1
+ &（使用 &amp;）
+ \$1（匹配 0 个或多个字符）
+ ?（完全匹配 1 个字符）

如果协议版本是 gRPC，则条件可特定于程序包、服务或方法。

**示例 HTTP 路径模式**
+ `/img/*`
+ `/img/*/pics`

**示例 gRPC 路径模式**
+ /package
+ /package.service/
+ /package.service/method

路径模式用于路由请求，而不是更改请求。例如，如果一个规则的路径模式为 `/img/*`，此规则会将 `/img/picture.jpg` 的请求作为 `/img/picture.jpg` 的请求转发给指定目标组。

**Example 路径模式条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。具有包含指定字符串的 URL 的请求满足以下条件。  

```
[
  {
      "Field": "path-pattern",
      "PathPatternConfig": {
          "Values": ["/img/*"]
      }
  }
]
```

```
[
  {
      "Field": "path-pattern",
      "PathPatternConfig": {
          "RegexValues": ["^\\/api\\/(.*)$"]
      }
  }
]
```

## 查询字符串条件
<a name="query-string-conditions"></a>

您可以使用查询字符串条件来配置基于查询字符串中的 key/value 对或值路由请求的规则。匹配评估不区分大小写。支持以下通配符：\$1（匹配 0 个或多个字符）和 ?（完全匹配 1 个字符）。

**Example 查询字符串条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。使用包含一 key/value 对 “version=v1” 或任何设置为 “example” 的密钥的查询字符串的请求满足以下条件。  

```
[
  {
      "Field": "query-string",
      "QueryStringConfig": {
          "Values": [
            {
                "Key": "version", 
                "Value": "v1"
            },
            {
                "Value": "*example*"
            }
          ]
      }
  }
]
```

## 源 IP 地址条件
<a name="source-ip-conditions"></a>

您可以使用源 IP 地址条件来配置基于请求的源 IP 地址路由请求的规则。必须以 CIDR 格式指定 IP 地址。您可以同时使用 IPv4 和 IPv6 地址。不支持通配符。不能为源 IP 规则条件指定 `255.255.255.255/32` CIDR。

如果客户端位于代理之后，则这是代理的 IP 地址，而不是客户端的 IP 地址。

 X-Forwarded-For标题中的地址不符合此条件。要在 X-Forwarded-For标题中搜索地址，请使用`http-header`条件。

**Example 来源 IP 条件示例**  
您可以在创建或修改规则时指定条件。有关更多信息，请参阅 [create-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 和 [modify-rule](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-rule.html) 命令。源 IP 地址位于某个指定的 CIDR 块中的请求满足以下条件。  

```
[
  {
      "Field": "source-ip",
      "SourceIpConfig": {
          "Values": ["192.0.2.0/24", "198.51.100.10/32"]
      }
  }
]
```