

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

# 侦听器规则的转换
<a name="rule-transforms"></a>

规则转换会在将入站请求路由到目标之前对其进行重写。重写请求不会改变在评估规则条件时做出的路由决定。当客户端发送的 URL 或主机标头与目标预期的标头不同时，这将非常实用。

使用规则转换将修改路径、查询字符串和主机标头的责任转移到给负载均衡器。这样就无需在应用程序代码中添加自定义修改逻辑，也无需依赖第三方代理来执行修改。

应用程序负载均衡器支持侦听器规则的以下转换。转换

`host-header-rewrite`  
重写请求中的主机标头。转换使用正则表达式来比对主机标头中的模式，然后将其替换为替换字符串。

`url-rewrite`  
重写请求 URL。转换使用正则表达式来比对请求 URL 中的模式，然后将其替换为替换字符串。

**转换基础知识**
+ 每条规则可以添加一个主机标头重写转换和一个 URL 重写转换。
+ 无法向默认规则添加转换。
+ 如果没有模式匹配，则会将原始请求发送到目标。
+ 如果存在模式匹配但转换失败，我们将返回 HTTP 500 错误。
+ 规则转换中使用的正则表达式不支持以下功能：lookheads、lookbehind、反向引用、原子组、所有格量词、子例程、递归和 Unicode 字符类（例如）。`\p{L}`

## 主机标头重写转换
<a name="host-header-rewrite-transforms"></a>

您可以修改主机标头中指定的域名。

**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) 命令。以下是一个主机标头转换示例。此示例会将主机标头转换为一个内部端点。  

```
[
  {
      "Type": "host-header-rewrite",
      "HostHeaderRewriteConfig": {
          "Rewrites": [
              {
                  "Regex": "^mywebsite-(.+).com$",
                  "Replace": "internal.dev.$1.myweb.com"
              }
          ]
      }
  }
]
```
例如，此转换会将主机标头 `https://mywebsite-example.com/project-a` 重写为 `https://internal.dev.example.myweb.com/project-a`。

## URL 重写转换
<a name="url-rewrite-transforms"></a>

您可以修改 URL 的路径或查询字符串。通过在负载均衡器级别重写 URL，即使您的后端服务发生变化，您的前端 URLs 也可以保持用户和搜索引擎的一致性。此外还可以简化复杂的 URL 查询字符串，更遍布客户键入。

请注意，不能修改 URL 的协议或端口，只能修改路径和查询字符串。

**Example URL 重写转换示例**  
您可以在创建或修改规则时指定转换。有关更多信息，请参阅 [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 重写转换示例。此示例会将目录结构转换为查询字符串。  

```
[
  {
      "Type": "url-rewrite",
      "UrlRewriteConfig": {
          "Rewrites": [
              {
                  "Regex": "^/dp/([A-Za-z0-9]+)/?$",
                  "Replace": "/product.php?id=$1"
              }
          ]
      }
  }
]
```
例如，此转换会将请求 URL `https://www.example.com/dp/B09G3HRMW` 重写为 `https://www.example.com/product.php?id=B09G3HRMW`。

**URL 重写与 URL 重定向的区别**


| 特征 | URL 重定向 | URL 重写 | 
| --- | --- | --- | 
| URL 显示 | 浏览器地址栏中有变化 | 浏览器地址栏中无变化 | 
| 状态代码 | 使用 301（永久）或 302（临时） | 状态代码无变化 | 
| Processing | 浏览器端 | 服务器端 | 
| 常见用途 | 域名变更、网站整合、修复损坏的链接 | 清理 URLs 搜索引擎优化，隐藏复杂结构，提供旧版网址映射 | 