

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

# 新增、移除或取代 CloudFront 分配的內容
<a name="AddRemoveReplaceObjects"></a>

本節說明如何確保 CloudFront 能夠存取您要向檢視器提供的內容，如何在您的網站或應用程式中指定物件，以及如何移除或取代內容。

**Topics**
+ [新增和存取 CloudFront 分佈的內容](#AddingObjects)
+ [使用檔案版本控制來更新或移除具有 CloudFront 分佈的內容](UpdatingExistingObjects.md)
+ [自訂 CloudFront 中檔案的 URL 格式](LinkFormat.md)
+ [指定預設根物件](DefaultRootObject.md)
+ [使檔案失效以移除內容](Invalidation.md)
+ [提供壓縮檔案](ServingCompressedFiles.md)

## 新增和存取 CloudFront 分佈的內容
<a name="AddingObjects"></a>

當您希望 CloudFront 分配內容 (物件) 時，您會將檔案新增至您指定用於分配的原始伺服器之一，並公開該檔案的 CloudFront 連結。CloudFront 節點不會從原始伺服器擷取新檔案，除非節點收到了對檔案發出的檢視器請求。如需詳細資訊，請參閱 [CloudFront 如何交付內容](HowCloudFrontWorks.md)。

當您新增要讓 CloudFront 分配的檔案時，請確保將其新增到分配中所指定的任一個 Amazon S3 儲存貯體，或者若是自訂原始伺服器，則新增到指定的網域內的某個目錄。此外，請確認適用的快取行為中路徑模式是否傳送請求到正確原始伺服器。

例如，假設快取行為的路徑模式是 `*.html`。若您尚未配置任何其他快取行為以將請求轉送到該原始伺服器，CloudFront 便只會轉送 `*.html` 檔案。在此情況下，舉例而言，CloudFront 絕不會分配您上傳至原始伺服器的 .jpg 檔案，因為您尚未建立任何包括 .jpg 檔案的快取行為。

CloudFront 伺服器不會就其所提供的物件判斷 MIME 類型。當您上傳檔案到原始伺服器時，建議您為該檔案設定 `Content-Type` 標頭欄位。

# 使用檔案版本控制來更新或移除具有 CloudFront 分佈的內容
<a name="UpdatingExistingObjects"></a>

若要更新 CloudFront 為您設定的現有內容，建議您在檔案名稱或資料夾名稱中使用版本識別碼。這可協助您控制管理 CloudFront 提供的內容。

## 使用版本控制的檔案名稱更新現有檔案
<a name="ReplacingObjects"></a>

當您更新 CloudFront 分佈中的現有檔案時，建議您在檔案名稱或目錄名稱中包括某一類的版本識別符，以便更有效控管您的內容。此識別碼可能是日期時間戳記、序號或區分兩個相同物件版本的其他方法。

例如，您可能會命名圖形檔案為 image\$11.jpg，而不是命名為 image.jpg。當您想要開始提供檔案的新版本，則命名新檔案名稱為 image\$12.jpg 並更新在 Web 應用程式或網站的連結以指向 image\$12.jpg。或者，您可能會將所有圖形放在 images\$1v1 目錄中，且當您想要開始提供一或多個圖形的新版本時，您可建立新的 images\$1v2 目錄，並更新連結以指向該目錄。使用版本控制，在 CloudFront 開始提供新版本之前，您不必等到物件過期，且您不需要支付物件失效。

即使您對檔案進行版本控制，仍建議您設定過期日期。如需詳細資訊，請參閱 [管理內容保持在快取中達多久時間 (過期)](Expiration.md)。

**注意**  
指定版本控制的檔案名稱或目錄名稱與 Amazon S3 物件版本控制無關。

## 移除內容，使 CloudFront 不會對其進行分配
<a name="RemovingObjects"></a>

您可以從原始伺服器移除您不再希望納入 CloudFront 分佈中的檔案。不過，CloudFront 將繼續向檢視器顯示邊緣快取中的內容，直到檔案過期。

若您想要立即移除檔案，就必須執行以下其中一項：
+ **使用檔案版本控制。**當您使用版本控制時，檔案的不同版本將具有不同的名稱，可供您用於 CloudFront 分佈中以更改要傳回給檢視器的檔案。如需詳細資訊，請參閱[使用版本控制的檔案名稱更新現有檔案](#ReplacingObjects)。
+ **使該檔案失效。**如需詳細資訊，請參閱[使檔案失效以移除內容](Invalidation.md)。

# 自訂 CloudFront 中檔案的 URL 格式
<a name="LinkFormat"></a>

在以您希望 CloudFront 提供給檢視器的物件設定原始伺服器之後，您必須在您的網站或應用程式中使用正確的 URL 參照這些物件，以便 CloudFront 提供這些物件。

針對網頁或 Web 應用程式中的物件，您在 URLs 中使用的網域名稱可以是下列任一種：
+ 建立分佈時，CloudFront 會自動指派網域名稱，例如 `d111111abcdef8.cloudfront.net`
+ 您自己的網域名稱，例如 `example.com`

例如，您可以使用下列其中一個 URLs 傳回檔案 `image.jpg`：

`https://d111111abcdef8.cloudfront.net/images/image.jpg`

`https://example.com/images/image.jpg`

可以使用相同的 URL 格式無論在 Amazon S3 儲存貯體或自訂原始伺服器存放內容，像是自己的 Web 伺服器其中之一。

**注意**  
URL 格式部分取決於您在分佈中為 **Origin Path (原始伺服器路徑)** 指定的值。這個值可讓 CloudFront 頂端目錄路徑適用於物件。如需有關建立分佈時設定原始伺服器路徑的詳細資訊，請參閱[原始伺服器路徑](DownloadDistValuesOrigin.md#DownloadDistValuesOriginPath)。

如需 URL 格式的詳細資訊，請參閱下列各節：

## 使用您自己的網域名稱 (example.com)
<a name="LinkFormat_OwnDomain"></a>

您可以[新增一個更容易的使用替代網域名稱](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesCNAME) (例如 `example.com`)，而非使用 CloudFront 在建立分佈時指派給您的預設網域名稱。透過使用 CloudFront 設定自己的網域名稱，您可以在分佈中使用像這樣適用於物件的 URL：

`https://example.com/images/image.jpg`

如果您計劃在檢視器與 CloudFront 之間使用 HTTPS，請參閱[使用備用網域名稱和 HTTPS](using-https-alternate-domain-names.md)。

## 在 URL 中使用結尾斜線 (/)
<a name="LinkFormat_TrailingSlash"></a>

當您在 CloudFront 分佈中為目錄指定 URL 時，請選擇要一律使用結尾斜線或一律不使用結尾斜線。例如，只選擇下列其中一種格式來適用於所有 URL：

`https://d111111abcdef8.cloudfront.net/images/`

`https://d111111abcdef8.cloudfront.net/images`

**它為什麼重要？**

這兩種格式都可以連結到 CloudFront 物件，但是當您以後要讓目錄失效，連結的一致性可協助防止問題發生。CloudFront 完全按照定義存放 URL，包括結尾斜線。因此，如果格式不一致，則需要使用或不使用斜線來讓目錄 URL 失效，以確保 CloudFront 移除目錄。

必須讓兩種 URL 格式都失效是麻煩事，且還會導致額外成本。這是因為如果您必須加倍失效處理以涵蓋這兩種類型的 URL，則可能會超出該月允許的免費失效處理數上限。如果發生這種情況，則需要支付所有的失效處理，即使在 CloudFront 中每個目錄 URL 只有一個格式。

## 建立適用於受限制內容的簽署 URL
<a name="LinkFormat_SignedURLs"></a>

如果您想要限制存取內容，可以建立簽署 URL。例如，如果只想分配您的內容給已授權的使用者，可以建立僅適用於特定時段內有效的 URL，或只從指定 IP 位址的 URL。如需詳細資訊，請參閱[使用已簽署 URL 和已簽署 Cookie 提供私有內容](PrivateContent.md)。

# 指定預設根物件
<a name="DefaultRootObject"></a>

當使用者 (檢視器) 請求分佈的根 URL，而不是請求該分佈中的物件時，您可以設定由 CloudFront 傳回特定的物件 (預設根物件)。您可以使用預設根物件以避免暴露分佈的內容。

**Contents**
+ [如何指定預設根物件](#DefaultRootObjectHowToDefine)
+ [預設根物件的運作方式](#DefaultRootObjectHow)
+ [未定義根物件的情況下 CloudFront 的運作方式](#DefaultRootObjectNotSet)

## 如何指定預設根物件
<a name="DefaultRootObjectHowToDefine"></a>

為了避免暴露分佈的內容或傳回錯誤，請為您的分佈指定預設根物件。您可以指定確切的檔案名稱或檔案的路徑。例如，如果您的根物件是 `index.html` 檔案，您可以指定該檔案名稱。如果您的 `index.html` 檔案位於另一個資料夾中，請改為指定路徑，例如 `exampleFolderName/index.html`。如果您設定預設根物件的路徑，檢視器對分佈根 URL 的請求會從該路徑傳回指定的檔案。您可以使用檔案路徑在原始伺服器更靈活地組織內容，因為您的預設根物件可以位於資料夾，而不是根層級。<a name="DefaultRootObjectProcedure"></a>

**指定分佈的預設根物件**

1. 上傳預設根物件到您分佈指向的原始伺服器。

   檔案可以是由 CloudFront 支援的任何類型。針對檔案名稱上限制條件的清單，請參閱《Amazon CloudFront API 參考》**之 [DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html) 中的 `DefaultRootObject` 元素說明。
**注意**  
如果預設根物件的檔案名稱太長或包含無效字元，則 CloudFront 會傳回錯誤 `HTTP 400 Bad Request - InvalidDefaultRootObject`。此外，CloudFront 會快取程式碼 10 秒 (預設情況下)，並將結果寫入存取日誌。

1. 確認物件授予 CloudFront 的許可至少包括讀取權限。

   如需 Amazon S3 許可的詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的 [Amazon S3 中的身分和存取管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)。

1. 請更新您的分佈，以使用 CloudFront 主控台或 CloudFront API 參照預設根物件。

   如要使用 CloudFront 主控台指定預設根物件：

   1. 登入 AWS 管理主控台 ，並在 開啟 CloudFront 主控台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

   1. 在上方窗格中的分佈清單裡，請選取分佈來更新。

   1. 在 **Settings** (設定) 窗格中的 **General** (一般) 標籤，選擇 **Edit** (編輯)。

   1. 在**編輯設定**對話方塊的**預設根物件**欄位中，輸入預設根物件的檔案名稱或路徑。
**提示**  
您的字串不能以正斜線 (`/`) 開頭。僅指定物件名稱或物件的路徑。例如，使用 `index.html` 或 `exampleFolderName/index.html`。指定 `/exampleFolderName/index.html` 或 `/index.html` 可能會導致 [403 存取遭拒錯誤](http-403-permission-denied.md)。

   1. 選擇**儲存變更**。

   若要更新使用 CloudFront API 的組態，請在分佈中指定 `DefaultRootObject` 元素的值。如需使用 CloudFront API 指定預設根物件的詳細資訊，請參閱*《Amazon CloudFront API 參考》*中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

1. 確認您已藉由請求根 URL 來啟用預設根物件。如果您的瀏覽器不會顯示預設根物件，請執行以下步驟：

   1. 確認是否藉由檢視 CloudFront 主控台中的分佈狀態來完全部署您的分佈。

   1. 重複步驟 2 和 3 來驗證您是否已授予正確的許可和驗證您是否正確地更新分佈的組態來指定預設根物件。

## 預設根物件的運作方式
<a name="DefaultRootObjectHow"></a>

假設以下請求指向物件 `image.jpg`：

`https://d111111abcdef8.cloudfront.net/image.jpg`

相對地，以下請求指向同一分佈的根 URL，而非如前述範例指向特定物件：

`https://d111111abcdef8.cloudfront.net/`

當您定義預設根物件時，呼叫分佈根的最終使用者請求會傳回預設的根物件。例如，如果您指定檔案 `index.html` 為預設根物件，則請求：

`https://d111111abcdef8.cloudfront.net/`

傳回：

`https://d111111abcdef8.cloudfront.net/index.html`

**注意**  
CloudFront 不會判斷具有多條結尾斜線 (`https://d111111abcdef8.cloudfront.net///`) 的 URL 是否等於 `https://d111111abcdef8.cloudfront.net/`。您的原始伺服器會進行這項比較。

如果您定義預設根物件時，適用於分佈子目錄的最終使用者請求不會傳回預設的根物件。例如，假設 `index.html` 是您的預設根物件，則 CloudFront 會收到在 CloudFront 分佈下適用於 `install` 目錄的最終使用者請求：

`https://d111111abcdef8.cloudfront.net/install/`

CloudFront 不會傳回預設根物件，即使 `index.html` 的副本出現在 `install` 目錄中。不過，如果您已指定預設根物件的*路徑*，(`install/index.html`) CloudFront 會傳回 `install` 目錄最終使用者請求的預設根物件

如果您配置分佈來允許 CloudFront 支援的所有 HTTP 方法，則預設根物件便套用到所有方法。例如，如果您的預設根物件是 index.php，而且您編寫應用程式將 `POST` 請求提交至網域 (https://example.com) 的根，則 CloudFront 會將請求傳送至 https://example.com/index.php。

CloudFront 預設根物件的行為與 Amazon S3 索引文件的行為不同。當您配置 Amazon S3 儲存貯體做為網站，並指定索引文件時，Amazon S3 傳回索引文件，即使使用者在儲存貯體中請求子目錄。(索引文件的副本必須出現在每個子目錄)。有關將 Amazon S3 儲存貯體設定為網站以及索引文件的詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [AmazonS3 上的託管網站](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html)一章。

**重要**  
請記住，預設根物件僅適用於您的 CloudFront 分佈。您仍然需要為原始伺服器管理安全性。例如，如果您使用 Amazon S3 原始伺服器，您仍然需要設定適當的 Amazon S3 儲存貯體 ACL，以確保在儲存貯體上您想要的存取層級。

## 未定義根物件的情況下 CloudFront 的運作方式
<a name="DefaultRootObjectNotSet"></a>

如果您不定義預設根物件，則分佈根的請求會通過您的原始伺服器。如果您使用 Amazon S3，有可能傳回以下任何情況：
+ **Amazon S3 儲存貯體內容的清單** — 在任何以下條件，使用 CloudFront 存取分佈的任何人都可看到您原始伺服器的內容：
  + 您的儲存貯體未設定正確。
  + 儲存貯體上的 Amazon S3 許可與您的分佈相關連，且在儲存貯體中物件上把存取權限給予*每個人*。
  + 最終使用者使用原始伺服器根 URL 存取原始伺服器。
+ **原始伺服器的私有內容清單** — 如果您配置原始伺服器做為私有分佈 (只有您與 CloudFront 有存取權限)，有登入資料通過 CloudFront 來存取分佈的任何人都可以看到與分佈相關連的 Amazon S3 儲存貯體內容。在這種情況下，使用者無法透過您的原始伺服器根 URL 來存取您的內容。如需有關分佈私有內容的詳細資訊，請參閱[使用已簽署 URL 和已簽署 Cookie 提供私有內容](PrivateContent.md)。
+ `Error 403 Forbidden` — CloudFront 傳回此錯誤，如果許可在與分佈相關連的 Amazon S3 儲存貯體中，或許可在拒絕存取 CloudFront 和所有人的儲存貯體裡物件上。

# 使檔案失效以移除內容
<a name="Invalidation"></a>

若您需要在檔案過期之前將其從 CloudFront 邊緣快取移除，則可執行以下其中一項：
+ 透過節點快取使該檔案失效。下次若有檢視器請求該檔案，CloudFront 將傳回原始伺服器以擷取檔案的最新版本。
+ 使用檔案版本控制以提供該檔案具有不同名稱的不同版本。如需詳細資訊，請參閱[使用版本控制的檔案名稱更新現有檔案](UpdatingExistingObjects.md#ReplacingObjects)。

**Topics**
+ [選擇要使檔案失效或者使用版本控制的檔案名稱](#Invalidation_Expiration)
+ [確定要失效的檔案](invalidation-access-logs.md)
+ [讓檔案失效時的注意事項](invalidation-specifying-objects.md)
+ [使檔案失效](Invalidation_Requests.md)
+ [並行失效請求上限](InvalidationLimits.md)
+ [支付檔案失效的費用](PayingForInvalidation.md)

## 選擇要使檔案失效或者使用版本控制的檔案名稱
<a name="Invalidation_Expiration"></a>

若要控制從分佈中提供的檔案版本，您可使檔案失效或以版本控制的檔案名稱為其命名。如果您想經常更新檔案，建議您主要使用檔案版本控制，原因如下：
+ 版本控制可讓您控制請求傳回哪些檔案，甚至是使用者什麼時候在本地或在企業快取代理之後快取一個版本。如果您使該檔案失效，使用者可能會繼續看到舊版本，直到檔案從這些快取中過期。
+ CloudFront 存取日誌包含檔案的名稱，所以版本控制能讓您更輕鬆地分析檔案變更的結果。
+ 版本控制讓您可向不同的使用者提供不同版本的檔案。
+ 版本控制簡化了檔案修訂版本之間的往返復原。
+ 版本控制更便宜。將新版本的檔案傳輸到節點仍需要支付 CloudFront 費用，而使檔案失效則不必支付任何費用。

如需檔案版本控制的詳細資訊，請參閱[使用版本控制的檔案名稱更新現有檔案](UpdatingExistingObjects.md#ReplacingObjects)。

# 確定要失效的檔案
<a name="invalidation-access-logs"></a>

若您要使多個檔案失效，例如某個目錄中的所有檔案，或者檔名以相同字元開頭的所有檔案，則可在失效路徑的結尾包含 `*` 萬用字元。如需有關使用 `*` 萬用字元的詳細資訊，請參閱[Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths)。

若要使檔案失效，您可以指定個別檔案的路徑或以 `*` 萬用字元結尾的路徑，其可能會套用到一個或多個檔案，如以下範例所示：
+ `/images/image1.jpg`
+ `/images/image*`
+ `/images/*`

如果您想要使選定的檔案失效，但使用者不需要存取原始伺服器上的每個檔案，則您可以判斷檢視器向 CloudFront 要求了哪些檔案，並只讓這些檔案失效。若要判斷檢視器要求了哪些檔案，請啟用 CloudFront 存取記錄。如需存取日誌的詳細資訊，請參閱[存取日誌 （標準日誌）](AccessLogs.md)。

# 讓檔案失效時的注意事項
<a name="invalidation-specifying-objects"></a>

當您指定要失效的檔案時，請參閱下列資訊：

**區分大小寫**  
失效路徑區分大小寫。例如，`/images/image.jpg` 和 `/images/Image.jpg` 指定兩個不同的檔案。

**使用 Lambda 函數變更 URI**  
如果您的 CloudFront 分佈在檢視器請求事件中觸發 Lambda 函數，而且該函數變更了請求檔案的 URI，我們建議您使以下兩種 URI 失效，以便從 CloudFront 邊緣快取中移除檔案：  
+ 在檢視器請求中的 URI
+ 函數予以變更之後的 URI

**Example 範例**  
例如，假設您的 Lambda 函數變更了檔案的 URI，而其原本為：  
`https://d111111abcdef8.cloudfront.net/index.html`  
到包含語言目錄的 URI：  
`https://d111111abcdef8.cloudfront.net/en/index.html`  
若要使該檔案失效，您必須指定以下路徑：  
+ `/index.html`
+ `/en/index.html`
如需詳細資訊，請參閱[Invalidation paths](#invalidation-specifying-objects-paths)。

**預設根物件**  
若要使預設根物件 (檔案) 失效，請以您為任何其他檔案指定路徑的相同方式指定其路徑。如需詳細資訊，請參閱[預設根物件的運作方式](DefaultRootObject.md#DefaultRootObjectHow)。

 **轉送 Cookie**  
如果您配置 CloudFront 轉送 Cookie 到原始伺服器，則 CloudFront 邊緣快取可能包含檔案的多個版本。當您使檔案失效後，CloudFront 會使該檔案的每個快取版本皆失效，無論其是否與 Cookie 關聯。您無法根據關聯的 Cookie 選擇性地使某些版本而不是其他版本失效。如需詳細資訊，請參閱[根據 Cookie 快取內容](Cookies.md)。

 **Forwarding headers** (轉送標頭)  
如果您配置 CloudFront 轉送標頭清單到原始伺服器，並且根據標頭的值進行快取，則 CloudFront 邊緣快取可能包含檔案的多個版本。當您使檔案失效後，CloudFront 會使該檔案的每個快取版本皆失效，無論其標頭值為何。您無法根據標頭值選擇性地使某些版本而不是其他版本失效。(如果您將 CloudFront 配置為將所有標頭轉送到原始伺服器，CloudFront 不會快取您的檔案。) 如需詳細資訊，請參閱[根據請求標頭快取內容](header-caching.md)。

 **轉送查詢字串**  
如果您配置 CloudFront 轉送查詢字串至原始伺服器，使檔案失效時您必須包含查詢字串，如以下範例所示：  
+ `/images/image.jpg?parameter1=a`
+ `/images/image.jpg?parameter1=b`
如果用戶端請求包含針對同一檔案的五種不同查詢字串，則您可以使該檔案失效五次，每一查詢字串一次，或者也可在失效路徑中使用 \$1 萬用字元，如以下範例所示：  
`/images/image.jpg*`  
如需有關在失效路徑使用萬用字元的詳細資訊，請參閱[Invalidation paths](#invalidation-specifying-objects-paths)。  
如需查詢字串的詳細資訊，請參閱[根據查詢字串參數快取內容](QueryStringParameters.md)。  
若要判斷哪些查詢字串使用中，您可以啟用 CloudFront 記錄功能。如需詳細資訊，請參閱[存取日誌 （標準日誌）](AccessLogs.md)。

**允許的上限**  
如需允許的失效數量上限詳細資訊，請參閱 [並行失效請求上限](InvalidationLimits.md)。

 **Microsoft Smooth Streaming file** (Microsoft Smooth Streaming 檔案)  
當您已啟用對應快取行為的 Smooth Streaming 時，您不能使 Microsoft Smooth Streaming 格式中的媒體檔案失效。

 **Non-ASCII or unsafe characters in the path** (路徑中非 ASCII 或不安全字元)  
如果路徑包含非 ASCII 字元或 [RFC 1738](https://tools.ietf.org/html/rfc1738) 中定義的不安全字元，請將這些字元進行 URL 編碼。切勿對路徑中的任何其他字元進行 URL 編碼，否則 CloudFront 不會使更新後檔案的舊版本失效。  
請勿在路徑中使用 `~` 字元。CloudFront 不支援此字元的失效，無論其是否為 URL 編碼。

 **Invalidation paths** (失效路徑)  
路徑與分佈有關。例如，要使在 `https://d111111abcdef8.cloudfront.net/images/image2.jpg` 的檔案失效，您可以指定 `/images/image2.jpg`。  
在 [CloudFront 主控台](https://console.aws.amazon.com/cloudfront/v4/home)中，您可以省略路徑中的前導斜線，如：`images/image2.jpg`。直接使用 CloudFront API 時，無效驗證路徑須以前綴斜線開頭。
您也可以使用 `*` 萬用字元使多個檔案同時失效。取代 0 或多個字元的 `*`，必須是失效路徑的最後一個字元。  
若要在失效中使用萬用字元 (\$1)，您必須將萬用字元放在路徑尾端。插入其他任何位置的星號 (\$1) 都會視為常值字元相符，而不是萬用字元失效。
如果您使用 AWS Command Line Interface (AWS CLI) 使檔案失效，並指定包含`*`萬用字元的路徑，則必須在類似 的路徑周圍使用引號 (`"`)`"/*"`。  
路徑的長度上限為 4,000 個字元。  

**Example 範例：失效路徑**  
+ 使某個目錄中的所有檔案失效：

  `/`*directory-path*`/*` (目錄路徑)
+ 若要使某個目錄、其所有子目錄以及該目錄與子目錄中的所有檔案失效：

  `/`*directory-path*`*` (目錄路徑)
+ 為了使所有名稱相同，但不同的檔案名稱延伸的檔案失效，例如 logo.jpg、logo.png 和 logo.gif：

  `/`*directory-path* (目錄路徑) `/`*file-name* (檔案名稱) `.*`
+ 無論檔案名稱延伸如何，若要使檔案名稱以相同字元開頭的目錄中的所有檔案（例如 HLS 格式中影片的所有檔案）失效：

  `/`*directory-path* (目錄路徑) `/`*initial-characters-in-file-name* (檔案名稱中的初始字元) `*`
+ 當您配置 CloudFront 根據查詢字串參數進行快取時，要使檔案的每個版本皆失效：

  `/`*directory-path* (目錄路徑) `/`*file-name* (檔案名稱) `.`*file-name-extension* (檔案名稱延伸) `*`
+ 使分佈中的所有檔案失效：

  `/*`
如需使用 Lambda 函數變更 URI 的情況下使檔案失效的詳細資訊，請參閱[Changing the URI Using a Lambda Function](#invalidation-lambda-at-edge)。  
如果失效路徑是一個目錄且如果您尚未標準化指定目錄的方法 (包含或不含結尾斜線 (/))，我們建議您，讓包含及不包含結尾斜線的目錄皆失效，例如 `/images` 和 `/images/`。

**Signed URLs** (簽署的 URL)  
如果您使用已簽章的 URL，則透過僅包含問號 (？) 前面的 URL 部分以使檔案失效。

# 使檔案失效
<a name="Invalidation_Requests"></a>

您可以使用 CloudFront 主控台來建立與執行失效，顯示您之前提交的失效清單，以及顯示有關個別失效的詳細資訊。您也可以複製現有的失效、編輯檔案路徑的清單和執行已編輯的失效。您可以從清單移除失效。

**Contents**
+ [使檔案失效](#invalidating-objects-console)
+ [複製、編輯和重新執行現有的失效](#invalidating-objects-copy-console)
+ [取消失效](#canceling-invalidations)
+ [列出失效](#listing-invalidations-console)
+ [顯示有關失效的資訊](#invalidation-details-console)

## 使檔案失效
<a name="invalidating-objects-console"></a>

若要使用 CloudFront 主控台使檔案失效，請執行以下步驟。

------
#### [ Console ]<a name="invalidating-objects-console-procedure"></a>

**使檔案失效 (主控台)**

1. 登入 AWS 管理主控台 ，並在 開啟 CloudFront 主控台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 選擇您欲使其檔案失效的分佈。

1. 請選擇 **Invalidations (失效)** 索引標籤。

1. 請選擇**建立失效**。

1. 針對您要使其失效的檔案，每行輸入一個失效路徑。如需有關指定失效路徑的詳細資訊，請參閱[讓檔案失效時的注意事項](invalidation-specifying-objects.md)。
**重要**  
請謹慎指定檔案路徑。開始後便無法取消失效請求。

1. 請選擇**建立失效**。

------
#### [ CloudFront API ]

如需了解使物件失效及顯示與失效相關資訊的詳細資訊，請參閱《Amazon CloudFront API 參考》**的以下主題：
+ [CreateInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html) 
+ [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)
+ [GetInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetInvalidation.html)

**注意**  
如果您使用 AWS Command Line Interface (AWS CLI) 使檔案失效，並指定包含`*`萬用字元的路徑，則必須在路徑周圍使用引號 (`"`)，例如下列範例：  

```
aws cloudfront create-invalidation --distribution-id distribution_ID --paths "/*"
```

------

## 複製、編輯和重新執行現有的失效
<a name="invalidating-objects-copy-console"></a>

您可以複製您之前建立的失效、更新失效路徑的清單，並執行已更新的失效。您不能複製現有的失效、更新失效路徑，接著儲存更新的失效且無需執行。

**重要**  
如果您在失效進行中複製失效、更新失效路徑清單，並接著執行更新的失效，CloudFront 不會停止或刪除您複製的失效。若有任何失效路徑出現在原始伺服器本和複本中，CloudFront 會嘗試使檔案失效兩次，且這兩次失效均將計入您每個月免費的失效數上限。如果您已達到免費的失效數上限，即將支付每個檔案兩次失效的費用。如需詳細資訊，請參閱[並行失效請求上限](InvalidationLimits.md)。<a name="invalidating-objects-copy-console-procedure"></a>

**複製、編輯和重新執行現有的失效**

1. 登入 AWS 管理主控台 ，並在 開啟 CloudFront 主控台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 請選取包含您欲複製的失效的分佈。

1. 請選擇 **Invalidations (失效)** 索引標籤。

1. 選擇您想要複製的失效。

   如果您不確定要複製哪個失效，可以選擇一個失效並選擇**檢視詳細資訊**以顯示有關失效的詳細資訊。

1. 選擇**複製到新的**。

1. 如果適用，請更新失效路徑清單。

1. 請選擇**建立失效**。

## 取消失效
<a name="canceling-invalidations"></a>

當您提交失效請求到 CloudFront 時，CloudFront 幾秒鐘內便轉送請求到所有節點，且每個節點立即開始處理失效。因此，提交後便無法取消失效。

## 列出失效
<a name="listing-invalidations-console"></a>

您可以使用 CloudFront 主控台，顯示過去您已建立且執行分佈的 100 個失效的清單。如果您想要取得超過 100 個失效的清單，請使用 `ListInvalidations` API 操作。如需詳細資訊，請參閱 *Amazon CloudFront API 參考*中的 [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)。<a name="listing-invalidations-console-procedure"></a>

**列出失效**

1. 登入 AWS 管理主控台 ，並在 開啟 CloudFront 主控台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 請選取欲顯示失效清單的分佈。

1. 請選擇 **Invalidations (失效)** 索引標籤。

**注意**  
您無法從清單移除失效。

## 顯示有關失效的資訊
<a name="invalidation-details-console"></a>

您可以顯示有關失效的詳細資訊，包括分佈 ID、失效 ID、失效的狀態、建立失效的日期和時間，以及失效路徑的完整清單。<a name="invalidation-details-console-procedure"></a>

**顯示有關失效的資訊**

1. 登入 AWS 管理主控台 ，並在 開啟 CloudFront 主控台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 請選取包含您欲顯示詳細資訊的失效的分佈。

1. 請選擇 **Invalidations (失效)** 索引標籤。

1. 選擇適用的失效 ID 或選擇失效 ID，然後選擇**檢視詳細資訊**。

# 並行失效請求上限
<a name="InvalidationLimits"></a>

如果您使檔案逐個失效，則每個進行中的分佈可同時請求最多 3,000 個檔案失效。一次失效請求最多可達 3,000 個檔案，或針對單一檔案請求 3,000 次，或者總計不超過 3,000 個檔案的任何組合方式。例如，您可以提交 30 次失效請求，每次使 100 個檔案失效。只要 30 個失效請求都仍在進行中，您就無法提交任何更多的失效請求。如果超過上限，CloudFront 會傳回錯誤訊息。

如果您使用 \$1 萬用字元，則每次進行中都可以請求最多 15 個失效路徑。您也可以就每一進行中的分佈同時請求失效最多 3,000 個檔案；萬用字元失效請求允許的上限與檔案逐個失效的上限無關。

# 支付檔案失效的費用
<a name="PayingForInvalidation"></a>

您每月提交的前 1,000 個失效路徑免費；您只需支付每月超過 1,000 個的每一失效路徑。每一失效路徑可適用於單一檔案 (如 `/images/logo.jpg`) 或多個檔案 (如 `/images/*`)。包含 `*` 萬用字元的路徑即便導致 CloudFront 使數千個檔案失效，也算作一個路徑。

每月 1,000 個免費失效路徑的上限適用於您建立一個 AWS 帳戶中所有分佈的失效路徑總數。例如，如果您使用 AWS 帳戶 `john@example.com`建立三個分佈，並在指定月份*為每個分佈*提交 600 個失效路徑 （總共 1，800 個失效路徑）， AWS 會向您收取失效路徑總數與 1000 個免費限制之間的差異。在此範例中， AWS 會在該月向您收取 800 個失效路徑的費用。

無論您要使之失效的檔案有多少，單一檔案 (`/images/logo.jpg`) 還是所有與分佈關聯的檔案 (`/*`)，提交失效路徑的費用皆相同。由於您失效請求中的每個路徑都會向您收費，即使您將多個路徑綁定到單一請求中，每個路徑仍會個別計入計費目的。

如需無效定價的詳細資訊，請參閱 [Amazon CloudFront 定價](https://aws.amazon.com/cloudfront/pricing/)。如需有關失效路徑的詳細資訊，請參閱[Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths)。

# 提供壓縮檔案
<a name="ServingCompressedFiles"></a>

請求的物件壓縮後物件較小，下載更快 – 在某些情況下，壓縮後還不到原始檔案的四分之一大小。加速下載可讓瀏覽者享有更快速的網頁轉譯，特別是 JavaScript 和 CSS 檔案。此外，CloudFront 資料傳輸成本是根據提供的總資料量計算。提供壓縮物件的成本可能低於未壓縮物件。

**Topics**
+ [設定 CloudFront 來壓縮物件](#compressed-content-cloudfront-configuring)
+ [CloudFront 壓縮如何運作](#compressed-content-cloudfront-how-it-works)
+ [壓縮條件](#compressed-content-cloudfront-notes)
+ [CloudFront 壓縮的檔案類型](#compressed-content-cloudfront-file-types)
+ [`ETag` 標頭轉換](#compressed-content-cloudfront-etag-header)

## 設定 CloudFront 來壓縮物件
<a name="compressed-content-cloudfront-configuring"></a>

若要設定 CloudFront 來壓縮物件，請更新您想提供壓縮物件的快取行為。

**設定 CloudFront 壓縮物件 (主控台)**

1. 登入 [CloudFront 主控台](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 選擇您的分佈，然後選擇要編輯的**行為**。

1. 請將**自動壓縮物件**設定為**是**。

1. 使用[快取政策](controlling-the-cache-key.md)來指定快取設定，並確保 **Gzip** 和 **Brotli** 壓縮格式皆已啟用。

**備註**  
您必須使用[快取政策](controlling-the-cache-key.md)來使用 Brotli 壓縮。Brotli 不支援舊版快取設定。
若要使用 [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html) 或 [CloudFront](https://docs.aws.amazon.com/cloudfront/latest/APIReference/Welcome.html) API 啟用壓縮，請將 `Compress`、`EnableAcceptEncodingGzip`、`EnableAcceptEncodingBrotli` 參數設定為 `true`。

若要瞭解 CloudFront 如何壓縮物件，請參閱下一節。

## CloudFront 壓縮如何運作
<a name="compressed-content-cloudfront-how-it-works"></a>

1. 一個檢視器請求了一個物件。檢視器會在請求中包含 `Accept-Encoding` HTTP 標頭，而標頭值則包含 `gzip`、`br` 或兩者。這表示檢視器支援壓縮物件。檢視器同時支援 Gzip 和 Brotli 時，CloudFront 會使用 Brotli。
**注意**  
只有在使用 HTTPS 發送請求時，Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這兩種瀏覽器不支援 HTTP 請求的 Brotli。

1. 在節點，CloudFront 會檢查快取中是否有所請求物件的壓縮副本。

1. CloudFront 會根據壓縮物件是否在快取中執行下列其中一項操作：
   + 如果快取中已有壓縮物件，則 CloudFront 會將物件傳送至檢視器，略過其餘步驟。
   + 如果快取中沒有壓縮物件，則 CloudFront 會將請求轉送至原始伺服器。
**注意**  
如果物件的未壓縮副本已存在於快取中，CloudFront 會將該物件傳送至檢視器，而不會將請求轉送至原始伺服器。舉例來說，如果 CloudFront [先前略過壓縮作業](#compression-skipped)，就會發生這種情況。發生這種情況時，CloudFront 會快取未壓縮的物件並繼續提供物件，直到物件過期、移出或無效為止。

1. 如果原始伺服器傳回壓縮物件 (由 HTTP 回應中出現的 `Content-Encoding` 標頭所指示)，CloudFront 會將壓縮的物件傳送到檢視器，將其新增到快取並略過其餘步驟。CloudFront 不會再次壓縮物件。

1. 如果原始伺服器將未壓縮的物件傳回到 CloudFront，且 HTTP 回應中沒有 `Content-Encoding` 標頭，CloudFront 會判斷物件是否可壓縮。如需詳細資訊，請參閱[壓縮條件](#compressed-content-cloudfront-notes)。

1. 如果物件可以壓縮，CloudFront 會壓縮物件並將其傳送至檢視器，然後新增到快取。

1. 如果相同物件有後續的檢視器請求，CloudFront 會傳回第一個快取版本。例如若檢視器請求使用 Gzip 壓縮的特定快取物件，且檢視器*接受* Gzip 格式，則對相同物件的後續請求一律會傳回 Gzip 版本，即使檢視器同時接受 Brotli 和 Gzip。

某些自訂原始伺服器也可以壓縮物件。您的原始伺服器可能可以壓縮 CloudFront 無法壓縮的物件。如需詳細資訊，請參閱[CloudFront 壓縮的檔案類型](#compressed-content-cloudfront-file-types)。

## 壓縮條件
<a name="compressed-content-cloudfront-notes"></a>

下列清單提供詳細資訊，說明 CloudFront 不會壓縮物件的情境。

**請求使用 HTTP 1.0**  
如果對 CloudFront 的請求使用 HTTP 1.0，則 CloudFront 會移除 `Accept-Encoding` 標頭，並且不會壓縮回應中的物件。

**`Accept-Encoding` 請求標頭**  
如果檢視器請求中缺少 `Accept-Encoding` 標頭，或者如果其中不包含 `gzip` 或 `br` 作為值，則 CloudFront 不會壓縮回應中的物件。如果 `Accept-Encoding` 標頭包含額外的值，例如 `deflate`，則 CloudFront 在將請求轉送到原始伺服器之前會先移除這些值。  
當 CloudFront [設定為壓縮物件](#compressed-content-cloudfront-configuring)時，它會在快取金鑰中和原始伺服器請求中自動包含 `Accept-Encoding` 標頭。

**當您設定 CloudFront 來壓縮物件時，內容已快取**  
CloudFront 會在從原始伺服器取得物件時壓縮物件。當您設定 CloudFront 來壓縮物件時，CloudFront 不會壓縮已在節點快取的物件。此外，如果快取物件在某個邊緣節點中已過期，但 CloudFront 又將對此物件的另一個請求轉送到原始伺服器，則原始伺服器傳回 HTTP 狀態碼 304 時，CloudFront 不會壓縮物件。這表示邊緣節點已有最新版本的物件。如果您想讓 CloudFront 壓縮已在節點快取的物件，您必須讓這些物件失效。如需詳細資訊，請參閱 [使檔案失效以移除內容](Invalidation.md)。

**已配置原始伺服器來壓縮物件**  
如果您設定 CloudFront 來壓縮物件，而原始伺服器也壓縮物件，則原始伺服器應會包含 `Content-Encoding` 標頭。此標頭會向 CloudFront 指出物件已壓縮。原始伺服器回應包含 `Content-Encoding` 標頭時，則無論標頭的值為何，CloudFront 都不會壓縮物件。CloudFront 會將回應傳送給檢視器，並且在節點快取物件。

**CloudFront 壓縮的檔案類型**  
如需完整清單，請參閱 [CloudFront 壓縮的檔案類型](#compressed-content-cloudfront-file-types)。

**CloudFront 壓縮的物件大小**  
CloudFront 壓縮的物件大小介於 1,000 個位元組到 10,000,000 個位元組之間。

**`Content-Length` 標頭**  
原始伺服器必須在回應中包含 `Content-Length` 標頭，以便 CloudFront 判斷物件的大小是否在 CloudFront 壓縮的範圍內。如果 `Content-Length` 標頭遺失、包含無效值，或包含 CloudFront 可壓縮大小範圍之外的值，CloudFront 不會壓縮物件。如需詳細資訊瞭解 CloudFront 如何處理可能超過大小範圍的大型物件，請參閱 [CloudFront 如何處理物件的部分請求 (範圍 GET)](RangeGETs.md)。

**回應的 HTTP 狀態碼**  
只有在回應的 HTTP 狀態碼為 `200`、`403` 或 `404` 時，CloudFront 才會壓縮物件。

**回應沒有內文**  
當來自原始伺服器的 HTTP 回應沒有內文時，CloudFront 沒有可以壓縮的內容。

**`ETag` 標頭**  
CloudFront 有時會在壓縮物件時修改 HTTP 回應中的 `ETag` 標頭。如需詳細資訊，請參閱[`ETag` 標頭轉換](#compressed-content-cloudfront-etag-header)。

**CloudFront 略過壓縮作業**  
CloudFront 一般會盡力壓縮物件，在極少數情況下，CloudFront 會在 CloudFront 遇到高流量負載時略過壓縮物件。CloudFront 會根據多種因素 (包括主機容量) 決定是否略過壓縮作業。CloudFront 略過物件的壓縮作業時，會快取未壓縮物件並繼續將物件提供給檢視者，直到物件過期、移出或失效為止。

## CloudFront 壓縮的檔案類型
<a name="compressed-content-cloudfront-file-types"></a>

如果您設定 CloudFront 來壓縮物件，則 CloudFront 僅會壓縮 `Content-Type` 回應標頭中具有下列值的物件：
+ `application/dash+xml`
+ `application/eot`
+ `application/font`
+ `application/font-sfnt`
+ `application/javascript`
+ `application/json`
+ `application/opentype`
+ `application/otf`
+ `application/pdf`
+ `application/pkcs7-mime`
+ `application/protobuf`
+ `application/rss+xml`
+ `application/truetype`
+ `application/ttf`
+ `application/vnd.apple.mpegurl`
+ `application/vnd.mapbox-vector-tile`
+ `application/vnd.ms-fontobject`
+ `application/wasm`
+ `application/xhtml+xml`
+ `application/xml`
+ `application/x-font-opentype`
+ `application/x-font-truetype`
+ `application/x-font-ttf`
+ `application/x-httpd-cgi`
+ `application/x-javascript`
+ `application/x-mpegurl`
+ `application/x-opentype`
+ `application/x-otf`
+ `application/x-perl`
+ `application/x-ttf`
+ `font/eot`
+ `font/opentype`
+ `font/otf`
+ `font/ttf`
+ `image/svg+xml`
+ `text/css`
+ `text/csv`
+ `text/html`
+ `text/javascript`
+ `text/js`
+ `text/plain`
+ `text/richtext`
+ `text/tab-separated-values`
+ `text/xml`
+ `text/x-component`
+ `text/x-java-source`
+ `text/x-script`
+ `vnd.apple.mpegurl`

## `ETag` 標頭轉換
<a name="compressed-content-cloudfront-etag-header"></a>

如果來自原始伺服器的未壓縮物件包含有效的強 `ETag` HTTP 標頭，CloudFront 壓縮該物件時，CloudFront 會將強 `ETag` 標頭值轉換為弱 `ETag`，並將弱 `ETag` 值傳回給檢視器。檢視器可以儲存弱值 `ETag`，並使用它來傳送具有 `If-None-Match` HTTP 標頭的條件式請求。這可讓檢視器 CloudFront 和原始伺服器將物件的壓縮和未壓縮版本視為語義上等效的物件，從而減少不必要的資料傳輸。

有效的強式 `ETag` 標頭值以雙引號字元 (`"`) 開頭和結尾。若要將強值 `ETag` 轉換為弱值，CloudFront 會將字元 `W/` 新增至強值 `ETag` 的開頭。

當來自原始伺服器的物件包含弱標頭值 `ETag` (以字元 `W/` 開頭的值) 時，CloudFront 不會修改此值，而是按照從原始伺服器接收的原樣傳回給檢視器。

當原始伺服器的物件包含無效的 `ETag` 標頭值 (非以 `"` 或 `W/` 開頭的值) 時，CloudFront 會移除 `ETag` 標頭，並將不含 `ETag` 回應標頭的物件傳回給檢視器。

如需詳細資訊，請參閱 MDN Web 文件中的下列頁面：
+ [指示詞](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#Directives) (`ETag` HTTP 標頭)
+ [弱驗證](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#Weak_validation) (HTTP 條件式請求)
+ [If-None-Match HTTP 標頭](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)