

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

# 對所有邊緣函數的限制
<a name="edge-function-restrictions-all"></a>

下列限制適用於所有邊緣函數，包括 CloudFront Functions 和 Lambda@Edge。

**Topics**
+ [AWS 帳戶 擁有權](#function-restrictions-account-ownership)
+ [結合 CloudFront Functions 與 Lambda@Edge](#function-restrictions-combining-functions)
+ [HTTP 狀態碼](#function-restrictions-status-codes)
+ [HTTP 標頭](#function-restrictions-headers)
+ [查詢字串](#function-restrictions-query-strings)
+ [URI](#function-restrictions-uri)
+ [URI、查詢字串，以及標頭編碼](#function-restrictions-encoding)
+ [Microsoft Smooth Streaming](#function-restrictions-microsoft-smooth-streaming)
+ [標記](#function-restrictions-tagging)

## AWS 帳戶 擁有權
<a name="function-restrictions-account-ownership"></a>

若要將邊緣函數與 CloudFront 分佈產生關聯，函數和分佈必須由相同的 AWS 帳戶擁有。

## 結合 CloudFront Functions 與 Lambda@Edge
<a name="function-restrictions-combining-functions"></a>

下列限制適用於指定的快取行為：
+ 每個事件類型 (檢視器請求、原始伺服器請求、原始伺服器回應和檢視器回應) 只能有一個邊緣函數關聯。
+ 您無法在檢視器事件 (檢視器請求和檢視器回應) 中結合 CloudFront Functions 和 Lambda@Edge。

允許邊緣函數的所有其他組合。下表說明了允許的組合。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/edge-function-restrictions-all.html)

## HTTP 狀態碼
<a name="function-restrictions-status-codes"></a>

當原始伺服器傳回 HTTP 狀態碼 400 (或更高值) 時，CloudFront 不會針對檢視器回應事件調用邊緣函數。

CloudFront 會針對*所有*原始伺服器回應，呼叫原始伺服器回應事件的 Lambda@Edge 函數，包括在原始伺服器傳回 HTTP 狀態碼 400 (或更高值) 時。如需詳細資訊，請參閱 [在原始伺服器回應觸發條件中更新 HTTP 回應](lambda-generating-http-responses.md#lambda-updating-http-responses)。

## HTTP 標頭
<a name="function-restrictions-headers"></a>

某些 HTTP 標頭不允許使用，這意味著這些標頭不會公開給邊緣函數，且函數無法新增這些標頭。其他標頭則設為唯讀，代表函數可以讀取這些標頭，但無法新增、修改或刪除。

**Topics**
+ [不允許的標頭](#function-restrictions-disallowed-headers)
+ [唯讀標頭](#function-restrictions-read-only-headers)

### 不允許的標頭
<a name="function-restrictions-disallowed-headers"></a>

下列 HTTP 標頭不會公開給邊緣函數，且函數無法新增這些標頭。如果您的函數新增這些標頭之一，CloudFront 驗證請求會失敗，且 CloudFront 會傳回 HTTP 狀態碼 502 (無效的閘道) 給檢視器。
+ `Connection` 
+ `Expect`
+ `Keep-Alive`
+ `Proxy-Authenticate`
+ `Proxy-Authorization`
+ `Proxy-Connection`
+ `Trailer`
+ `Upgrade`
+ `X-Accel-Buffering`
+ `X-Accel-Charset`
+ `X-Accel-Limit-Rate`
+ `X-Accel-Redirect`
+ `X-Amz-Cf-*`
+ `X-Amzn-Auth`
+ `X-Amzn-Cf-Billing`
+ `X-Amzn-Cf-Id`
+ `X-Amzn-Cf-Xff`
+ `X-Amzn-Errortype`
+ `X-Amzn-Fle-Profile`
+ `X-Amzn-Header-Count`
+ `X-Amzn-Header-Order`
+ `X-Amzn-Lambda-Integration-Tag`
+ `X-Amzn-RequestId`
+ `X-Cache`
+ `X-Edge-*`
+ `X-Forwarded-Proto`
+ `X-Real-IP`

### 唯讀標頭
<a name="function-restrictions-read-only-headers"></a>

下列標頭為唯讀的狀態。您的函數可以讀取這些標頭並將其作為函數邏輯的輸入，但無法變更其值。如果您的函數新增或編輯了唯讀標頭，請求會無法通過 CloudFront 驗證，而且 CloudFront 會傳回 HTTP 狀態碼 502 (無效的閘道) 給檢視器。

#### 檢視器請求事件中的唯讀標頭
<a name="function-restrictions-read-only-headers-viewer-request"></a>

下列標頭在檢視器請求事件中為唯讀的狀態。
+ `CDN-Loop`
+ `Content-Length`
+ `Host`
+ `Transfer-Encoding`
+ `Via`

#### 原始伺服器請求事件中的唯讀標頭 (僅限 Lambda@Edge)
<a name="function-restrictions-read-only-headers-origin-request"></a>

下列標頭在原始伺服器請求事件中為唯讀的狀態，僅存在於 Lambda@Edge 中。
+ `Accept-Encoding`
+ `CDN-Loop`
+ `Content-Length`
+ `If-Modified-Since`
+ `If-None-Match`
+ `If-Range`
+ `If-Unmodified-Since`
+ `Transfer-Encoding`
+ `Via`

#### 原始伺服器回應事件中的唯讀標頭 (僅限 Lambda@Edge)
<a name="function-restrictions-read-only-headers-origin-response"></a>

下列標頭在原始伺服器回應事件中為唯讀的狀態，僅存在於 Lambda@Edge 中。
+ `Transfer-Encoding`
+ `Via`

#### 檢視器回應事件中的唯讀標頭
<a name="function-restrictions-read-only-headers-viewer-response"></a>

下列標頭在 CloudFront Functions 與 Lambda@Edge 的檢視器回應事件中為唯讀。
+ `Warning`
+ `Via`

下列標頭在 Lambda@Edge 檢視器回應事件中為唯讀狀態。
+ `Content-Length`
+ `Content-Encoding`
+ `Transfer-Encoding`

## 查詢字串
<a name="function-restrictions-query-strings"></a>

下列限制適用於讀取、更新或在請求 URI 中建立查詢字串的函數。
+ (僅限 Lambda@Edge) 若要存取原始伺服器請求或原始伺服器回應函數中的查詢字串，您的快取政策或原始伺服器請求政策必須針對**查詢字串**設定為 **All** (全部)。
+ 函數可以為檢視器請求和原始伺服器請求事件建立或更新查詢字串 (原始伺服器請求事件僅存在於 Lambda@Edge 中)。
+ 函數可以讀取查詢字串，但無法為原始伺服器回應和檢視器回應事件建立或更新查詢字串 (原始伺服器回應事件僅存在於 Lambda@Edge 中)。
+ 如果函數建立或更新查詢字串，將適用下列限制：
  + 查詢字串不可包含空格、控制字元或片段識別碼 (`#`)。
  + URI 的總大小 (包含查詢字串) 必須小於 8,192 個字元。
  + 我們建議您於 URI 和查詢字串使用 % 編碼。如需詳細資訊，請參閱[URI、查詢字串，以及標頭編碼](#function-restrictions-encoding)。

## URI
<a name="function-restrictions-uri"></a>

如果函數為請求變更了 URI，這不會改變針對請求進行的快取動作，也不會改變請求轉傳目的地的原始伺服器。

URI 的總大小 (包含查詢字串) 必須小於 8,192 個字元。

## URI、查詢字串，以及標頭編碼
<a name="function-restrictions-encoding"></a>

傳遞給邊緣函數的 URI、查詢字串以及標頭值是使用 UTF-8 編碼。您的函數應針對其傳回的 URI、查詢字串和標頭值使用 UTF-8 編碼。百分比編碼與 UTF-8 編碼相容。

下列清單說明了 CloudFront 如何處理 URI、查詢字串值以及標頭的編碼：
+ 如果請求中的值為 UTF-8 編碼，CloudFront 不需變更值，即可將其轉傳給函數。
+ 當請求中的值採用 [ISO-8859-1 編碼](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)時，CloudFront 會將這些值轉換為 UTF-8 編碼，然後再將其轉傳給函數。
+ 當請求中的值採用其他字元編碼時，CloudFront 會假設其為 ISO-8859-1 編碼，並嘗試將 ISO-8859-1 編碼轉換為 UTF-8 編碼。
**重要**  
轉換後的字元中的值可能是原始伺服器請求的不正確轉譯。這可能會導致函數或原始伺服器產生意外結果。

CloudFront 轉傳給您的原始伺服器的 URI、查詢字符串和標頭值，取決於函數是否變更這些值：
+ 如果函數未變更 URI、查詢字串或標頭，CloudFront 會將請求所收到的值轉傳給您的原始伺服器。
+ 如果函數變更了 URI 查詢字串或標頭，CloudFront 會轉傳以 UTF-8 編碼的值。

## Microsoft Smooth Streaming
<a name="function-restrictions-microsoft-smooth-streaming"></a>

您無法將邊緣函數與已轉碼為 Microsoft Smooth Streaming 格式之串流媒體檔案的 CloudFront 分佈與搭配使用。

## 標記
<a name="function-restrictions-tagging"></a>

您無法將標籤新增至邊緣函數。如需 CloudFront 標記功能的詳細資訊，請參閱 [標記分佈](tagging.md)。