

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 接聽程式規則的動作類型
<a name="rule-action-types"></a>

動作會決定當接聽程式規則的條件滿足時，負載平衡器如何處理請求。每個規則必須至少有一個動作，指定如何處理相符的請求。每個規則動作都有類型和組態資訊。Application Load Balancer 支援接聽程式規則的下列動作類型。動作類型

`authenticate-cognito`  
[HTTPS 接聽程式] 使用 Amazon Cognito 來驗證使用者身分。如需詳細資訊，請參閱[使用者身分驗證](listener-authenticate-users.md)。

`authenticate-oidc`  
[HTTPS 接聽程式] 使用與 OpenID Connect (OIDC) 相容的身分提供者來驗證使用者。如需詳細資訊，請參閱[使用者身分驗證](listener-authenticate-users.md)。

`fixed-response`  
傳回自訂的 HTTP 回應。如需詳細資訊，請參閱[固定回應動作](#fixed-response-actions)。

`forward`  
將請求轉送到指定的目標群組。如需詳細資訊，請參閱[轉送動作](#forward-actions)。

`jwt-validation`  
驗證用戶端請求中的 JWT 存取字符。如需詳細資訊，請參閱[JWT 驗證](listener-verify-jwt.md)。

`redirect`  
將請求從一個 URL 重新導向到另一個 URL。如需詳細資訊，請參閱[重新導向動作](#redirect-actions)。

**動作基本概念**
+ 每個規則必須僅包含下列其中一個路由動作：`forward`、 `redirect`或 `fixed-response`，而且必須是要執行的最後一個動作。
+ HTTPS 接聽程式可以具有具有使用者身分驗證動作和路由動作的規則。
+ 有多個動作時，會先執行優先順序最低的動作。
+ 如果通訊協定版本為 gRPC 或 HTTP/2，則唯一支援的動作是 `forward` 動作。

## 固定回應動作
<a name="fixed-response-actions"></a>

`fixed-response` 動作會捨棄用戶端請求並傳回自訂 HTTP 回應。您可以使用此動作來傳回 2XX、4XX 或 5XX 回應代碼和選用的訊息。

採取 `fixed-response` 動作時，會在存取日誌中記錄重新導向目標的動作和 URL。如需詳細資訊，請參閱[存取日誌項目](load-balancer-access-logs.md#access-log-entry-format)。會在 `HTTP_Fixed_Response_Count` 指標中報告成功的 `fixed-response` 動作計數。如需詳細資訊，請參閱[Application Load Balancer 指標](load-balancer-cloudwatch-metrics.md#load-balancer-metrics-alb)。

**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": "fixed-response",
      "FixedResponseConfig": {
          "StatusCode": "200",
          "ContentType": "text/plain",
          "MessageBody": "Hello world"
      }
  }
]
```

## 轉送動作
<a name="forward-actions"></a>

`forward` 動作會將請求路由至它的目標群組。新增 `forward` 動作之前，請建立目標群組並將目標新增至群組。如需詳細資訊，請參閱[建立目標群組](create-target-group.md)。

**將流量分配至多個目標群組**  
如果您為一個 `forward` 動作指定多個目標群組，則必須為每個目標群組指定加權。每個目標群組權重為介於 0 到 999 之間的值。符合加權目標群組之監聽程式規則的請求，會根據其權重分配到這些目標群組。例如，如果您指定兩個目標群組，每個目標群組的權重為 10，則每個目標群組都會收到一半的請求。如果您指定兩個目標群組，一個權重為 10，另一個權重為 20，則權重為 20 的目標群組接收的請求數量是另一個目標群組的兩倍。

如果您設定規則在加權目標群組和其中一個目標群組之間分配流量是空的，或只有運作狀態不佳的目標，負載平衡器不會自動容錯移轉至具有運作狀態良好目標的目標群組。

**黏性工作階段和加權目標群組**  


根據預設，在加權的目標群組之間分配流量設定規則，並不保證可以接受黏性工作階段。若要確保接受黏性工作階段，請啟用目標群組的黏性規則。當負載平衡器首先將請求路由至加權目標群組時，它會產生名為 AWSALBTG 的 cookie，以編碼選取的目標群組相關資訊、加密 cookie，並在回應用戶端時包含 cookie。用戶端應該包含負載平衡器後續請求中接收的 cookie。當負載平衡器收到符合已啟用目標群組粘性的規則的請求並包含 cookie 時，會將請求路由至 cookie 中指定的目標群組。

Application Load Balancer 不支援 URL 編碼的 Cookie 值。

透過 CORS (跨來源資源共享) 請求，有些瀏覽器需要 `SameSite=None; Secure` 來啟用綁定。在此案例中，Elastic Load Balancing 會產生第二個 Cookie (AWSALBTGCORS)，其中包含與原始粘性 Cookie 相同的資訊以及此 `SameSite` 屬性。用戶端會同時收到這兩個 Cookie。

### 具有一個目標群組的轉送動作範例
<a name="forward-action-cli"></a>

您可以在建立或修改規則時指定動作。如需詳細資訊，請參閱 [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": "forward",
      "ForwardConfig": {
          "TargetGroups": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:{{us-west-2}}:{{123456789012}}:targetgroup/{{my-targets}}/{{73e2d6bc24d8a067}}"
              }
          ]
      }
  }
]
```

### 具有加權目標群組的向前動作範例
<a name="forward-action-multiple-target-groups-cli"></a>

下列動作會根據每個目標群組的權重，將要求轉送至兩個指定的目標群組。

```
[
  {
      "Type": "forward",
      "ForwardConfig": {
          "TargetGroups": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:{{us-west-2}}:{{123456789012}}:targetgroup/{{blue-targets}}/{{73e2d6bc24d8a067}}",
                  "Weight": 10
              },
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:{{us-west-2}}:{{123456789012}}:targetgroup/{{green-targets}}/{{09966783158cda59}}",
                  "Weight": 20
              }
          ]
      }
  }
]
```

### 已啟用粘性的轉送動作範例
<a name="forward-action-stickiness-cli"></a>

如果您有一個轉送動作涉及多個目標群組，且一個或多個目標群組已啟用[粘性會話](edit-target-group-attributes.md#sticky-sessions)，則您必須啟用目標群組粘性。

下列動作會將請求轉送至兩個指定的目標群組，搭配啟用目標群組黏性。不包含該綁定 Cookie 的請求會根據每個目標群組的權重進行路由。

```
[
  {
      "Type": "forward",
      "ForwardConfig": {
          "TargetGroups": [
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:{{us-west-2}}:{{123456789012}}:targetgroup/{{blue-targets}}/{{73e2d6bc24d8a067}}",
                  "Weight": 10
              },
              {
                  "TargetGroupArn": "arn:aws:elasticloadbalancing:{{us-west-2}}:{{123456789012}}:targetgroup/{{green-targets}}/{{09966783158cda59}}",
                  "Weight": 20
              }
          ],
          "TargetGroupStickinessConfig": {
              "Enabled": true,
              "DurationSeconds": 1000
          }
      }
  }
]
```

## 重新導向動作
<a name="redirect-actions"></a>

`redirect` 動作會將用戶端請求從一個 URL 重新導向到另一個 URL。您可以根據您的需求，將重新導向設定為暫時 (HTTP 302) 或永久 (HTTP 301)。

URI 包含以下元件：

```
{{protocol}}://{{hostname}}:{{port}}/{{path}}?{{query}}
```

您必須修改以下至少一個元件，以避免重新導向迴圈：protocol、hostname、port 或 path。未修改的任何元件會維持其原始值。

*protocol*  
通訊協定 (HTTP 或 HTTPS)。您可以重新導向 HTTP 到 HTTP、HTTP 到 HTTPS，以及 HTTPS 到 HTTPS。您不能重新導向 HTTPS 到 HTTP。

*hostname*  
主機名稱。主機名稱不區分大小寫、長度最多 128 個字元，由英數字元、萬用字元 (\* 和 ?) 和連字號 (-) 組成。

*port*  
連接埠 (1 到 65535)。

*路徑*  
絕對路徑，開頭為前置字元 "/"。路徑區分大小寫、長度最多 128 個字元，由英數字元、萬用字元 (\* 和 ?)、& (使用 &amp;) 和下列特殊字元組成：\_-.$/\~"'@:\+。

*query*  
查詢參數。長度上限為 128 個字元。

您可以使用以下預留關鍵字，來在目標 URL 中重複使用原始 URL 的 URI 元件：
+ `#{protocol}` - 保留通訊協定。用於通訊協定和查詢元件。
+ `#{host}` - 保留網域。用於主機名稱、路徑和查詢元件。
+ `#{port}` - 保留連接埠。用於連接埠、路徑和查詢元件。
+ `#{path}` - 保留路徑。用於路徑和查詢元件。
+ `#{query}` - 保留查詢參數。用於查詢元件。

採取 `redirect` 動作時，會將動作記錄於存取日誌中。如需詳細資訊，請參閱[存取日誌項目](load-balancer-access-logs.md#access-log-entry-format)。會在 `HTTP_Redirect_Count` 指標中報告成功的 `redirect` 動作計數。如需詳細資訊，請參閱[Application Load Balancer 指標](load-balancer-cloudwatch-metrics.md#load-balancer-metrics-alb)。

### 使用主控台的重新導向動作範例
<a name="redirect-action-console"></a>

**使用 HTTPS 和連接埠 40443 重新導向**  
以下規則會設定使用 HTTPS 通訊協定和指定連接埠 (40443) 永久重新導向到 URL，但會保留原始主機名稱、路徑和查詢參數。這個畫面等同於 "https://\#{host}:40443/\#{path}?\#{query}"。

![一個規則，使用 HTTPS 通訊協定和指定連接埠 (40443) 將請求重新導向到 URL，但會保留原始 URL 原始網域、路徑和查詢參數。](http://docs.aws.amazon.com/zh_tw/elasticloadbalancing/latest/application/images/redirect_https_port.png)


**使用修改過的路徑重新導向**  
以下規則會設定永久重新導向到 URL，保留通訊協定、連接埠、主機名稱和查詢參數，並使用 `#{path}` 關鍵字來建立修改的路徑。這個畫面等同於 "\#{protocol}://\#{host}:\#{port}/new/\#{path}?\#{query}"。

![一個規則，會將請求重新導向到 URL，保留通訊協定、連接埠、主機名稱和查詢參數，並使用 #{path} 關鍵字來建立修改的路徑。](http://docs.aws.amazon.com/zh_tw/elasticloadbalancing/latest/application/images/redirect_path.png)


### 使用 重新導向動作的範例 AWS CLI
<a name="redirect-action-cli"></a>

**使用 HTTPS 和連接埠 40443 重新導向**  
您可以在建立或修改規則時指定動作。如需詳細資訊，請參閱 [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) 命令。下列動作將 HTTP 請求重新導向到連接埠 443 的 HTTPS 請求，而且使用與 HTTP 請求相同的主機名稱、路徑和查詢字串。

```
  --actions '[{
      "Type": "redirect",
      "RedirectConfig": {
          "Protocol": "HTTPS",
          "Port": "443",
          "Host": "#{host}",
          "Path": "/#{path}",
          "Query": "#{query}",
          "StatusCode": "HTTP_301"
      }
  }]'
```