

# 为自定义域名设置路由模式
<a name="set-routing-mode"></a>

您可以选择 API Gateway 使用哪种路由模式将流量路由到 API。有关更多信息，请参阅 [在 API Gateway 中通过自定义域名将流量发送到 API](rest-api-routing-mode.md)。本节讨论自定义域名的路由模式。您必须为自定义域名设置路由模式，才能将流量路由到 API。支持以下路由模式：
+ **ROUTING\$1RULE\$1THEN\$1API\$1MAPPING**：使用此模式通过路由规则和 API 映射将流量发送到 API。在这种模式下，所有路由规则的优先级均高于任何 API 映射。有关此模式的示例，请参阅[示例 2：路由规则和 API 映射](rest-api-routing-rules-examples.md#rest-api-routing-rules-examples-rule-and-mappings)。
+ **ROUTING\$1RULE\$1ONLY**：使用此模式以仅支持路由规则向 API 发送流量。当自定义域名使用此模式时，您无法创建 API 映射，但可以使用 [get-api-mappings](https://docs.amazonaws.cn/cli/latest/reference/apigatewayv2/get-api-mappings.html) 命令来查看它们。API 调用方无法使用 API 映射来访问此域名。
+ **API\$1MAPPING\$1ONLY**：使用此模式以仅支持 API 映射向 API 发送流量。当自定义域名使用此模式时，您无法创建路由规则，但可以使用 `list-routing-rules` 命令来查看它们。API 调用方无法使用路由规则来访问此域名。

  这是您所有现有域名以及您创建的任何新域名的默认路由模式。

当您使用 `apigateway` 创建自定义域名时，`API_MAPPING_ONLY` 称为 `BASE_PATH_MAPPING_ONLY`，而 `ROUTING_RULE_THEN_API_MAPPING` 称为 `ROUTING_RULE_THEN_BASE_PATH_MAPPING`。此行为仅适用于 Amazon CLI、Amazon CloudFormation 或任何 SDK，但不存在于 Amazon Web Services 管理控制台中。

以下过程说明如何更改现有自定义域名的路由模式。当您更改自定义域名的路由模式时，API 调用方无法使用任何不支持的路由模式访问域名。

------
#### [ Amazon Web Services 管理控制台 ]

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.amazonaws.cn/apigateway)。

1. 从主导航窗格中选择**自定义域名**。

1. 选择自定义域名。

1. 对于**域详细信息**，选择**编辑**。

1. 对于**路由模式**，请选择 **ROUTING\$1RULE\$1THEN\$1API\$1MAPPING**。

1. 选择**保存**。

如果您将路由模式更改为 `ROUTING_RULE_ONLY` 或 `API_MAPPING_ONLY`，则将从控制台的域名详细信息页面中移除您创建的任何 API 映射或路由规则。如果您更改路由模式以支持路由规则或 API 映射，则这些资源将返回。

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

以下 [update-domain-name](https://docs.amazonaws.cn/cli/latest/reference/apigatewayv2/update-domain-name.html) 命令将域名更新为使用路由模式 `ROUTING_RULE_THEN_API_MAPPING`：

```
aws apigatewayv2 update-domain-name \
  --domain-name 'api.example.com' \
  --routing-mode "ROUTING_RULE_THEN_API_MAPPING"
```

输出将与以下内容类似：

```
{
"ApiMappingSelectionExpression": "$request.basepath",
"DomainName": "api.example.com",
"DomainNameArn": "arn:aws:apigateway:us-west-2::/domainnames/api.example.com",
"DomainNameConfigurations": [
  {
      "ApiGatewayDomainName": "d-abcdefg.execute-api.us-west-2.amazonaws.com",
      "CertificateArn": "arn:aws:acm:us-west-2:111122223333:certificate/abcdefg-123456-abcdefg",
      "DomainNameStatus": "AVAILABLE",
      "EndpointType": "REGIONAL",
      "HostedZoneId": "Z2OJLYMUO9EFXC",
      "SecurityPolicy": "TLS_1_2"
   }
 ],
"RoutingMode": "ROUTING_RULE_THEN_API_MAPPING",
"Tags": {}
}
```

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

以下 [update-domain-name](https://docs.amazonaws.cn/cli/latest/reference/apigateway/update-domain-name.html) 命令将私有自定义域名更新为使用路由模式 `ROUTING_RULE_THEN_BASE_PATH_MAPPING`：

```
aws apigateway update-domain-name \
  --domain-name 'private.example.com' \
  --patch-operations "op='replace',path='/routingMode',value='ROUTING_RULE_THEN_BASE_PATH_MAPPING'"
```

输出将与以下内容类似：

```
{
"domainName": "private.example.com",
"domainNameId": "abcd1234",
"domainNameArn": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
"certificateArn": "arn:aws:acm:us-west-2:111122223333:certificate/a1b2c3d4-5678-90ab-cdef",
"certificateUploadDate": "2024-09-10T10:31:20-07:00",
"endpointConfiguration": {
  "types": [
    "PRIVATE"
   ],
  "ipAddressType": "dualstack"
  },
"domainNameStatus": "AVAILABLE",
"securityPolicy": "TLS_1_2",
"policy": "...",
"routingMode" : "ROUTING_RULE_THEN_BASE_PATH_MAPPING"
}
```

------