

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

# 根據查詢字串參數快取內容
<a name="QueryStringParameters"></a>

有些 Web 應用程式使用查詢字串來傳送資訊到原始伺服器。查詢字串是 Web 請求的一部分，其顯示在 `?` 字元之後；此字串可包含以 `&` 字元分隔的一或多個參數。在下列範例中，查詢字串包含兩個參數，*color=red* 及 *size=large*：

`https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large`

針對分佈，您可以選擇是否要讓 CloudFront 將查詢字串轉送到原始伺服器，以及是否根據所有參數或選取的參數快取內容。為什麼說這可能很有用？ 請考量下列範例。

假設您的網站提供五種語言。網站所有五種版本的目錄結構和檔案名稱都相同。當使用者檢視網站時，轉送給 CloudFront 的請求包含一個根據使用者所選語言的語言查詢字串參數。可以設定 CloudFront 轉送查詢字串到原始伺服器，並根據語言參數快取。如果您設定 Web 伺服器來傳回與所選語言對應的指定頁面版本，則 CloudFront 會根據語言查詢字串參數的值分別快取每個語言版本。

在這個範例中，如果網站的主要頁面為 `main.html`，以下五個請求會造成 CloudFront 快取 `main.html` 五次，對各語言查詢字串參數的值進行一次快取：
+ `https://d111111abcdef8.cloudfront.net/main.html?language=de`
+ `https://d111111abcdef8.cloudfront.net/main.html?language=en`
+ `https://d111111abcdef8.cloudfront.net/main.html?language=es`
+ `https://d111111abcdef8.cloudfront.net/main.html?language=fr`
+ `https://d111111abcdef8.cloudfront.net/main.html?language=jp`

注意下列事項：
+ 有些 HTTP 伺服器不處理查詢字串參數，因此不會傳回根據參數值的物件不同版本。針對這些原始伺服器，如果您設定 CloudFront 轉送查詢字串參數至原始伺服器，即使原始伺服器為每個參數值傳回相同物件的版本給 CloudFront，CloudFront 仍會根據參數值執行快取。
+ 為使查詢字串參數能如以上範例所述搭配多種語言運作，各查詢字串參數間必須使用 `&` 字元做為分隔符號。如果您使用不同的分隔符號，即有可能得到非預期的結果，具體取決於您所指定供 CloudFront 做為快取基礎的參數以及這些參數在查詢字串中顯示的順序。

  以下範例顯示使用不同的分隔符號並將 CloudFront 設定為僅根據 `color` 參數進行快取時將會發生的情況：
  + 在下列請求中，CloudFront 根據 `color`參數值快取內容，但 CloudFront 將該值解譯為 *red;size=large*：

    `https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red;size=large`
  + 在下列請求中，CloudFront 快取內容但不根據查詢字串參數快取。這是因為根據 `color` 參數設定 CloudFront 來快取，但 CloudFront 解譯以下字串為只包含一個 `size` 參數，該參數的值為 *large;color=red*：

    `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large;color=red`

您可設定 CloudFront 執行以下其中一項：
+ 完全不要轉送查詢字串到原始伺服器。如果您不轉送查詢字串，CloudFront 不會根據查詢字串參數快取。
+ 轉送查詢字串到原始伺服器，以及在查詢字串中根據所有參數快取。
+ 轉送查詢字串到原始伺服器，以及在查詢字串中根據指定的參數快取。

如需詳細資訊，請參閱[最佳化快取](#query-string-parameters-optimizing-caching)。

**Topics**
+ [

## 查詢字串轉送和快取的主控台和 API 設定
](#query-string-parameters-console)
+ [

## 最佳化快取
](#query-string-parameters-optimizing-caching)
+ [

## 查詢字串參數和 CloudFront 標準記錄檔 (存取日誌)
](#query-string-parameters-access-logs)

## 查詢字串轉送和快取的主控台和 API 設定
<a name="query-string-parameters-console"></a>

當您在 CloudFront 主控台中建立分佈時，CloudFront 會根據原始伺服器類型為您設定查詢字串的轉送和快取。或者，您可以手動編輯這些設定。如需詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md) 中的下列主題：
+ [查詢字串轉送和快取](DownloadDistValuesCacheBehavior.md#DownloadDistValuesQueryString)
+ [查詢字串允許清單](DownloadDistValuesCacheBehavior.md#DownloadDistValuesQueryStringAllowlist)

如要使用 CloudFront API 設定查詢字串轉送和快取，請參閱《Amazon CloudFront API 參考》**中的 [CachePolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CachePolicy.html) 和 [OriginRequestPolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_OriginRequestPolicy.html)。

## 最佳化快取
<a name="query-string-parameters-optimizing-caching"></a>

根據查詢字串參數將 CloudFront 設為快取時，可以採取下列步驟來減少 CloudFront 轉送至原始伺服器的請求數。CloudFront 節點存取物件時，您可以減少原始伺服器的負載並降低延遲，因為物件由離您使用者較近的位置提供。

**快取僅根據原始伺服器傳回物件不同版本的參數**  
針對每個 Web 應用程式轉送到 CloudFront 的查詢字串參數，CloudFront 為每個參數值轉送請求到原始伺服器，且為每個參數值快取個別的物件版本 即使原始伺服器一律傳回相同物件，無論參數值如何，情況都是如此。對於多個參數，請求的數量和物件的數量相乘。  
我們建議您設定 CloudFront 快取僅根據原始伺服器傳回物件不同版本的查詢字串參數，並且根據每個參數仔細考慮快取的優點。例如，假設您有一個零售網站。您有六種不同顏色的夾克圖片，以及夾克有 10 種不同的大小。您已有的圖片顯示夾克的不同顏色，但不顯示不同大小。為了最佳化快取，應設定 CloudFront 僅根據顏色參數，而非根據大小參數來快取。這會增加 CloudFront 的可能性，可以提供來自快取的請求，這可以提高效能，並降低您的原始伺服器原始伺服器的負載。

**一律以相同順序列出參數**  
在查詢字串中參數的順序很重要。在下列範例中，查詢字串完全相同，除了參數的順序不同。這會造成 CloudFront 轉送兩個個別的 image.jpg 請求到原始伺服器並快取兩個個別的物件版本：  
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large`
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large&color=red`
我們建議您一律以相同順序列出參數名稱，例如字母順序。

**參數名稱和值請一律使用相同的大小寫**  
根據查詢字串參數快取時，CloudFront 考慮參數名稱和值的大小寫。在下列範例中，查詢字串完全相同，除了參數名稱和值的大小寫以外。這會造成 CloudFront 轉送四個個別的 image.jpg 請求到原始伺服器並快取四個個別的物件版本：  
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red`
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?color=Red`
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=red`
+ `https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=Red`
我們建議您為參數名稱和值使用一致的大小寫，例如全部小寫。

**不使用與簽署 URL 衝突的參數名稱**  
如果您使用簽署 URL 來限制存取內容 (如果您新增可信任簽署者到分佈)，在轉送 URL 的其他部分到原始伺服器之前，則 CloudFront 移除以下查詢字串參數：  
+ `Expires`
+ `Key-Pair-Id`
+ `Policy`
+ `Signature`
如果您使用簽署 URL，且想要設定 CloudFront 將查詢字串轉送到原始伺服器，則無法命名自己的查詢字串參數為 `Expires`、`Key-Pair-Id`、`Policy` 或 `Signature`。

## 查詢字串參數和 CloudFront 標準記錄檔 (存取日誌)
<a name="query-string-parameters-access-logs"></a>

如果您啟用記錄，則 CloudFront 會記錄完整的 URL，包括查詢字串參數。無論您是否已設定 CloudFront 將查詢字串轉送給原始伺服器，這都是如此。如需 CloudFront Front 記錄的詳細資訊，請參閱 [存取日誌 （標準日誌）](AccessLogs.md)。