

# 确定函数用途


在编写函数代码之前，请确定函数的用途。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 请求


您的函数可以修改 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 响应


您的函数可以在边缘生成 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 响应


您的函数可以在 CloudFront 将 HTTP 响应发送到查看器（客户端）之前修改 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 连接


连接函数是一种在 TLS 连接期间运行的 CloudFront Functions，用于提供自定义验证和身份验证逻辑。连接函数目前可用于双向 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 请求或响应。

## 相关信息


有关使用 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)