

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

# 確定函數的用途
<a name="function-code-choose-purpose"></a>

在撰寫函數程式碼之前，請先確定函數的用途。CloudFront Functions 中的大多數函數都具有以下用途之一。

**Topics**
+ [

## 修改檢視器請求事件類型中的 HTTP 請求
](#function-code-modify-request)
+ [

## 在檢視器請求事件類型中產生 HTTP 回應
](#function-code-generate-response)
+ [

## 在檢視者回應事件類型中修改 HTTP 回應
](#function-code-modify-response)
+ [

## 驗證連線請求事件類型的 mTLS 連線
](#function-code-connection-request)
+ [

## 相關資訊
](#related-information-cloudfront-functions-purpose)

無論函數的用途如何，`handler` 都是任何函數的入口點。它採用一個稱為 `event` 的參數，該參數由 CloudFront 傳遞給函數。`event` 是一個 JSON 對象，其中包含 HTTP 請求的表示 (以及回應，前提是您的函數修改了 HTTP 回應)。

## 修改檢視器請求事件類型中的 HTTP 請求
<a name="function-code-modify-request"></a>

您的函數可以修改 CloudFront 從檢視者 (用戶端) 接收的 HTTP 請求，並將修改後的請求返回給 CloudFront 以繼續處理。例如，您的函數程式碼可能會標準化[快取金鑰](understanding-the-cache-key.md)或修改請求標頭。

建立及發布修改 HTTP 請求的函數時，請務必新增*檢視器請求*事件類型的關聯。如需詳細資訊，請參閱[建立函數](functions-tutorial.md#functions-tutorial-create)。這會使 CloudFront 每次收到來自檢視器的請求時執行該函數，然後再檢視請求的物件是否位於 CloudFront 快取中。

**Example 範例**  
下面的虛擬程式碼顯示了修改 HTTP 請求的函數結構。  

```
function handler(event) {
    var request = event.request;

    // Modify the request object here.

    return request;
}
```
該函數將修改後的 `request` 物件返回到 CloudFront。CloudFront 會按如下方式繼續處理返回的請求：檢查 CloudFront 快取以取得快取命中率，並在必要時將請求傳送至來源。

## 在檢視器請求事件類型中產生 HTTP 回應
<a name="function-code-generate-response"></a>

您的函數可以在邊緣產生 HTTP 回應，並直接將其返回給檢視者 (用戶端)，而無需檢查快取的回應，也無需 CloudFront 進一步處理。例如，您的函數程式碼可能會將請求重新導向至新的 URL，或檢查授權並將 `401` 或 `403` 回應返回給未經授權的請求。

建立產生 HTTP 回應的函數時，請務必選擇*檢視者請求*事件類型。這表示 CloudFront 每次收到來自檢視者的請求時，該函數就會執行，然後 CloudFront 才進一步處理請求。

**Example 範例**  
下面的虛擬程式碼顯示了產生 HTTP 回應的函數結構。  

```
function handler(event) {
    var request = event.request;

    var response = ...; // Create the response object here,
                        // using the request properties if needed.

    return response;
}
```
該函數將 `response` 物件返回到 CloudFront，CloudFront 立即將其返回給檢視者，而無需檢查 CloudFront 快取或將請求傳送至來源。

## 在檢視者回應事件類型中修改 HTTP 回應
<a name="function-code-modify-response"></a>

您的函數可以在 CloudFront 將其發送給檢視者 (用戶端) 之前修改 HTTP 回應，無論該回應來自 CloudFront 快取還是來源。例如，您的函數代碼可能會新增或修改回應標頭、狀態碼，與本文內容。

建立可修改 HTTP 回應的函數時，請務必選擇*檢視者回應*事件類型。這表示無論回應是來自 CloudFront 快取還是來源，此函數都會在 CloudFront 將回應返回給檢視者之前執行。

**Example 範例**  
下面的虛擬程式碼顯示了修改 HTTP 回應的函數結構。  

```
function handler(event) {
    var request = event.request;
    var response = event.response;

    // Modify the response object here,
    // using the request properties if needed.

    return response;
}
```
該函數將修改後的 `response` 物件返回到 CloudFront，CloudFront 立即將其返回給檢視者。

## 驗證連線請求事件類型的 mTLS 連線
<a name="function-code-connection-request"></a>

連線函數是一種在 TLS 連線期間執行的 CloudFront 函數類型，可提供自訂驗證和身分驗證邏輯。連線函數目前可用於交互 TLS (mTLS) 連線，您可以在其中驗證用戶端憑證，並實作超出標準憑證驗證的自訂身分驗證邏輯。在 TLS 交握程序期間執行的連線函數，可以根據憑證屬性、用戶端 IP 地址或其他條件允許或拒絕連線。

在您建立和發佈連線函數之後，請務必新增*連線請求*事件類型的關聯與啟用 mTLS 的分佈。這可讓函數在每次用戶端嘗試與 CloudFront 建立 mTLS 連線時執行。

**Example**  
下列虛擬程式碼顯示連線函數的結構：  

```
function connectionHandler(connection) {
    // Validate certificate and connection properties here.
    
    if (/* validation passes */) {
        connection.allow();
    } else {
        connection.deny();
    }
}
```
函數使用協助程式方法來判斷是否允許或拒絕連線。與檢視器請求和檢視器回應函數不同，連線函數無法修改 HTTP 請求或回應。

## 相關資訊
<a name="related-information-cloudfront-functions-purpose"></a>

如需使用 CloudFront Functions 的詳細資訊，請參閱下列主題：
+ [事件結構](functions-event-structure.md)
+ [JavaScript 執行時期功能](functions-javascript-runtime-features.md)
+ [CloudFront Functions 範例 ](service_code_examples_cloudfront_functions_examples.md)
+ [對邊緣函數的限制](edge-functions-restrictions.md)