

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

# 管理內容保持在快取中達多久時間 (過期)
<a name="Expiration"></a>

您可以控制在 CloudFront 將另一個請求轉送至原始伺服器之前，檔案在 CloudFront 快取中停留的時間。降低持續時間允許您提供動態內容。增加持續時間表示您的使用者取得更好的效能，因為檔案更有可能是直接透過節點快取提供。較長的持續時間也能減少的原始伺服器的負載。

一般而言，CloudFront 從節點提供檔案，直到您指定的快取持續時間已經達到，亦即直到檔案過期。過期之後，下次邊緣節點取得檔案的使用者請求時，CloudFront 會將請求轉送到原始伺服器來驗證快取是否包含檔案的最新版本。來自原始伺服器的回應取決於檔案是否已變更：
+ 如果 CloudFront 快取已經有最新版本，則原始伺服器傳回狀態碼 `304 Not Modified`。
+ 如果 CloudFront 快取沒有最新的版本，則原始伺服器會傳回一個狀態碼 `200 OK` 和檔案的最新版本。

如果節點中的物件未被頻繁請求，CloudFront 可能會移出該檔案 (在檔案過期日期前移除檔案)，以將足夠的空間提供給最近被請求的檔案。

我們建議您透過更新分佈的快取政策來管理快取持續時間。如果您選擇不使用快取政策，預設 TTL (生存時間) 為 24 小時，但您可以更新下列設定來覆寫預設值：
+ 若要為符合相同路徑模式的所有檔案變更快取持續期間，您可以變更快取行為的 **Minimum TTL (最小 TTL)**、**Maximum TTL (最大 TTL)**，以及 **Default TTL (預設 TTL)** CloudFront 設定。如需個別設定的詳細資訊，請參閱 [最短 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL)、[最長 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 和 [預設 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesDefaultTTL)。
+ 若要變更個別檔案的快取持續期間，您可以設定原始伺服器來使用 `max-age` 或 `s-maxage` 指示詞將 `Cache-Control` 標頭，或是 `Expires` 標頭欄位新增到檔案。如需詳細資訊，請參閱[使用標頭來控制個別物件的快取持續時間](#expiration-individual-objects)。

如需有關 **Minimum TTL (最短 TTL)**、**Default TTL (預設 TTL)** 及 **Maximum TTL (最長 TTL)** 與 `max-age` 和 `s-maxage` 命令及 `Expires` 標頭欄位互動方式的詳細資訊，請參閱 [指定 CloudFront 快取物件的時間](#ExpirationDownloadDist)。

您也可以控制錯誤 (例如 `404 Not Found`) 在 CloudFront 快取中保留多久時間，然後 CloudFront 將再試一次藉由轉送另一個請求至原始伺服器以取得請求的物件。如需詳細資訊，請參閱[CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼](HTTPStatusCodes.md)。

**Topics**
+ [使用標頭來控制個別物件的快取持續時間](#expiration-individual-objects)
+ [提供過時 (過期) 內容](#stale-content)
+ [指定 CloudFront 快取物件的時間](#ExpirationDownloadDist)
+ [使用 Amazon S3 主控台新增標頭到物件](#ExpirationAddingHeadersInS3)

## 使用標頭來控制個別物件的快取持續時間
<a name="expiration-individual-objects"></a>

您可以使用 `Cache-Control` 和 `Expires` 標頭來控制物件在快取中保持多久的時間。**Minimum TTL (最短 TTL)**、**Default TTL (預設 TTL)** 及 **Maximum TTL (最長 TTL)** 的設定也會影響快取持續時間，但以下是標頭會如何影響快取持續時間的概觀：
+ `Cache-Control max-age` 指令可讓您指定您想要物件在快取中維持多久的時間 (以秒為單位)，然後 CloudFront 從原始伺服器再次取得物件。CloudFront 支援的最短到期時間是 0 秒。最長值為 100 年。請在下列格式中指定值：

  `Cache-Control: max-age=`*秒*

  例如，下列指令告訴 CloudFront 在快取中維持關聯的物件 3600 秒 (1 小時)：

  `Cache-Control: max-age=3600`

  如果您想要物件在 CloudFront 節點快取中保持的持續時間不同於在瀏覽器快取中保持的，您可以 `Cache-Control max-age` 和 `Cache-Control s-maxage` 指令併用。如需更多詳細資訊，請參閱 [指定 CloudFront 快取物件的時間](#ExpirationDownloadDist)。
+ `Expires` 標頭欄位可讓您使用 [RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 Section 3.3.1, Full Date](https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1) 中指定的格式來指定過期日期和時間，例如：

  `Sat, 27 Jun 2015 23:59:59 GMT`

我們建議您使用 `Cache-Control max-age` 指令，而不是 `Expires` 標頭欄位來控制物件快取。如果您同時為 `Cache-Control max-age` 與 `Expires` 指定值，則 CloudFront 僅使用 `Cache-Control max-age` 的值。

如需更多詳細資訊，請參閱 [指定 CloudFront 快取物件的時間](#ExpirationDownloadDist)。

您不能使用 HTTP `Cache-Control` 或來自檢視者的 `Pragma` 請求的 `GET` 標頭欄位，來強制 CloudFront 返回物件的原始伺服器。CloudFront 忽略檢視者請求中的這些標頭欄位。

如需有關 `Cache-Control` 與 `Expires` 標頭欄位的詳細資訊，請參閱 *RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1* 中的以下各節：
+ [Section 14.9 Cache Control](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) (14.9 節快取控制)
+ [Section 14.21 Expires](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21) (14.21 節過期)

## 提供過時 (過期) 內容
<a name="stale-content"></a>

CloudFront 支援 `Stale-While-Revalidate` 和 `Stale-If-Error` 快取控制指令。您可以使用這些指令來指定檢視器可使用過時內容的時間長度。

**Topics**
+ [`Stale-While-Revalidate`](#stale-while-revalidate)
+ [`Stale-If-Error`](#stale-if-error-only)
+ [使用兩種指令](#use-both-stale-directives)

### `Stale-While-Revalidate`
<a name="stale-while-revalidate"></a>

此指令允許 CloudFront 從快取中提供過時的內容，同時 CloudFront 會以非同步方式從原始伺服器擷取新版本。當檢視器立即從邊緣節點接收回應時，這可改善延遲，而不必等待背景擷取。新內容會在背景載入以供未來請求使用。

**Example 範例：`Stale-While-Revalidate`**  
當您將 `Cache-Control` 標頭設定為使用這些指令時，CloudFront 會執行下列動作。  

```
Cache-Control: max-age=3600, stale-while-revalidate=600
```

1. CloudFront 會將回應快取一小時 (`max-age=3600`)。

1. 如果請求在此持續時間之後發出，CloudFront 會提供過時內容，同時向原始伺服器傳送請求，以重新驗證和重新整理快取的內容。

1. 內容被重新驗證的同時，CloudFront 可為過時內容最多提供 10 分鐘 (`stale-while-revalidate=600`)。

**注意**  
CloudFront 會將過時的內容提供至 `stale-while-revalidate` 指令的值或 CloudFront [最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 的值，以較小者為準。在最長 TTL 持續時間之後，無論 `stale-while-revalidate` 值為何，都不會從邊緣節點快取提供過時的物件。

### `Stale-If-Error`
<a name="stale-if-error-only"></a>

在原始伺服器無法存取或傳回 500 至 600 的錯誤代碼時，此指令可讓 CloudFront 從快取中提供過時內容。這可確保檢視者即使在原始伺服器中斷期間也能存取內容。

**Example 範例：`Stale-If-Error`**  
當您將 `Cache-Control` 標頭設定為使用這些指令時，CloudFront 會執行下列動作。  

```
Cache-Control: max-age=3600, stale-if-error=86400
```

1. CloudFront 會快取回應一小時 (`max-age=3600`)。

1. 如果原始伺服器關閉或在此持續時間之後傳回錯誤，CloudFront 會持續提供過時內容最多 24 小時 (`stale-if-error=86400`)

1. 如您已設定自訂錯誤回應，如果在指定的 `stale-if-error` 持續時間內發生錯誤，CloudFront 會先嘗試提供過時內容。如果過時內容無法使用，則 CloudFront 會依對應錯誤狀態碼的設定提供自訂錯誤回應。如需詳細資訊，請參閱[產生自訂錯誤回應](GeneratingCustomErrorResponses.md)。

**備註**  
CloudFront 會將過時的內容提供至 `stale-if-error` 指令的值或 CloudFront [最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 的值，以較小者為準。在最長 TTL 持續時間之後，無論 `stale-if-error` 值為何，都不會從邊緣節點快取提供過時的物件。
如果您未設定 `stale-if-error` 或自訂錯誤回應，CloudFront 會根據請求的物件是否在邊緣節點快取中，傳回過時物件或將錯誤回應轉送回檢視器。如需詳細資訊，請參閱[您尚未設定自訂錯誤頁面時 CloudFront 如何處理錯誤](HTTPStatusCodes.md#HTTPStatusCodes-no-custom-error-pages)。

### 使用兩種指令
<a name="use-both-stale-directives"></a>

`stale-while-revalidate` 與 `stale-if-error` 是獨立的快取控制指令，您可以一起使用以減少延遲，並為原始伺服器新增緩衝區以便回應或復原。

**Example 範例：使用這兩個指令**  
當您將 `Cache-Control` 標頭設定為使用下列指令時，CloudFront 會執行下列動作。  

```
Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
```

1. CloudFront 會快取回應一小時 (`max-age=3600`)。

1. 如果請求在此持續時間之後提出，CloudFront 會在重新驗證內容期間最多提供 10 分鐘 (`stale-while-revalidate=600`) 的時間。

1. 如果原始伺服器在 CloudFront 嘗試重新驗證內容時傳回錯誤，CloudFront 將持續提供過時內容長達 24 小時 (`stale-if-error=86400`)。

快取是效能和更新狀態之間的平衡。使用類似 `stale-while-revalidate` 與 `stale-if-error` 指令可增強效能和使用者體驗，但請確保組態與您希望內容的更新狀態保持一致。過時內容指令最適合需要重新整理內容但不需要最新版本的使用案例。此外，如果您的內容沒有變更或很少變更，`stale-while-revalidate` 可能會新增不必要的網路要求。反之，請考慮設定較長的快取持續時間。

## 指定 CloudFront 快取物件的時間
<a name="ExpirationDownloadDist"></a>

若要控制 CloudFront 在傳送另一個請求至原始伺服器前將物件保留在快取中的時間，您可以：
+ 設定 CloudFront 分散式快取行為中的最短、最長和預設 TTL 值。您可以在連接至快取行為的[快取政策](controlling-the-cache-key.md) (建議使用) 或舊版快取設定中設定這些值。
+ 在來自原始伺服器的回應中包含 `Cache-Control` 或 `Expires` 標頭。這些標頭還有助於判定在傳送另一個請求到 CloudFront 之前，瀏覽器將物件保留在瀏覽器快取中的時間長度。

下表解釋了從原始伺服器傳送的 `Cache-Control` 和 `Expires` 標頭如何與快取行為中的 TTL 設定一起運作，以影響快取。


****  

| 原始標頭 | 最短 TTL = 0 | 最短 TTL > 0 | 
| --- | --- | --- | 
|  **原始伺服器將 `Cache-Control: max-age` 指示詞新增至物件**  |  **CloudFront 快取** CloudFront 會針對 `Cache-Control: max-age` 指令值或 CloudFront 最大 TTL 值兩者之中較小的值快取物件。 **瀏覽器快取** 瀏覽器會快取 `Cache-Control: max-age` 指令值的物件。  |  **CloudFront 快取** CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及 `Cache-Control max-age` 指示詞的值： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **瀏覽器快取** 瀏覽器會快取 `Cache-Control: max-age` 指令值的物件。  | 
|  **原始伺服器不會將 `Cache-Control: max-age` 指示詞新增至物件**  |  **CloudFront 快取** CloudFront 會快取 CloudFront 預設 TTL 值的物件。 **瀏覽器快取** 取決於瀏覽器。  |  **CloudFront 快取** CloudFront 會針對 CloudFront 最小 TTL 值或預設 TTL 值兩者之中較大的值快取物件。 **瀏覽器快取** 取決於瀏覽器。  | 
|  **原始伺服器將 `Cache-Control: max-age` 與 `Cache-Control: s-maxage` 指示詞新增至物件**  |  **CloudFront 快取** CloudFront 會針對 `Cache-Control: s-maxage` 指令值或 CloudFront 最大 TTL 值兩者之中較小的值快取物件。 **瀏覽器快取** 瀏覽器會快取 `Cache-Control max-age` 指令值的物件。  |  **CloudFront 快取** CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及 `Cache-Control: s-maxage` 指示詞的值： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **瀏覽器快取** 瀏覽器會快取 `Cache-Control: max-age` 指令值的物件。  | 
|  **原始伺服器將 `Expires` 標頭新增至物件**  |  **CloudFront 快取** CloudFront 會快取物件直到 `Expires` 標頭中的日期或 CloudFront 最大 TTL 值，以先到者為準。 **瀏覽器快取** 瀏覽器會快取物件直到 `Expires` 標頭中的日期。  |  **CloudFront 快取** CloudFront 快取取決於 CloudFront 最短 TTL 與最長 TTL 及 `Expires` 標頭的值： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/Expiration.html) **瀏覽器快取** 瀏覽器會快取物件直到 `Expires` 標頭中的日期與時間。  | 
|  **原始伺服器將 `Cache-Control: no-cache`、`no-store` 和/或 `private` 指示詞新增至物件**  |  CloudFront 和瀏覽器遵守標頭。  |  **CloudFront 快取** CloudFront 會快取 CloudFront 最小 TTL 值的物件。[請參閱此資料表下方的警告。](#stale-if-error) **瀏覽器快取** 瀏覽器遵守標頭。  | 

**警告**  
如果您的最小 TTL 大於 0，則即使原始標頭中存在 `Cache-Control: no-cache`、`no-store` 和/或 `private` 指令，CloudFront 都會使用快取政策的最小 TTL。  
如果原始伺服器可以存取，CloudFront 會從原始伺服器取得物件並將其傳回給檢視器。
如果原始伺服器無法連線，且最小*或*最大 TTL 大於 0，則 CloudFront 會處理之前從原始伺服器取得的物件。
為了避免這種行為，請將 `Cache-Control: stale-if-error=0` 指示詞與從原始伺服器傳回的物件一同包含。如果原始伺服器無法連線，這會導致 CloudFront 傳回錯誤以回應未來的請求，而不是傳回其之前從原始伺服器取得的物件。
當原始伺服器標頭包含 `Cache-Control: no-cache`、`no-store` 和/或 `private` 指令時，CloudFront 不會從 S3 原始伺服器快取 HTTP 501 狀態碼 (未實作)。這是 S3 原始伺服器的預設行為，即使您的[最小 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL) 設定大於 0 也一樣。

如需有關如何使用 CloudFront 主控台變更分佈設定的詳細資訊，請參閱 [更新分佈](HowToUpdateDistribution.md)。如需有關如何使用 CloudFront API 為分佈變更設定的詳細資訊，請參閱 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

## 使用 Amazon S3 主控台新增標頭到物件
<a name="ExpirationAddingHeadersInS3"></a>

您可以將 `Cache-Control` 或 `Expires` 標頭欄位新增至 Amazon S3 物件。若要執行此操作，請修改物件的中繼資料欄位。

**將 `Cache-Control` 或 `Expires` 標頭欄位新增至 Amazon S3 物件**

1. 請遵循**取代系統定義的中繼資料**一節中的程序。該程序位於 *Amazon S3 使用者指南*的[在 Amazon S3 主控台中編輯物件中繼資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-object-metadata.html)主題中。

1. 對於 **Key** (金鑰)，選擇您要新增的標頭名稱 (**Cache-Control** (快取控制) 或 **Expires** (過期))。

1. 對於 **Value** (值)，輸入標頭值。例如，對於 `Cache-Control` 標題，您可以輸入 `max-age=86400`。對於 `Expires`，您可以輸入過期日期和時間，例如 `Wed, 30 Jun 2021 09:28:00 GMT`。

1. 請遵循其餘程序以儲存中繼資料變更。