

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

# 了解回應標頭政策
<a name="understanding-response-headers-policies"></a>

您可以使用回應標頭政策指定 Amazon CloudFront 對傳送給檢視者的回應所移除或新增的 HTTP 標頭。如需回應標頭政策及其使用原因的詳細資訊，請參閱[在 CloudFront 回應中使用政策新增或移除 HTTP 標頭](modifying-response-headers.md)。

下列主題說明回應標頭政策中的設定。這些設定分為多個類別，下列主題中依次介紹這些類別。

**Topics**
+ [政策詳細資訊 (中繼資料)](#understanding-response-headers-policies-details)
+ [CORS 標頭](#understanding-response-headers-policies-cors)
+ [安全性標頭](#understanding-response-headers-policies-security)
+ [自訂標頭](#understanding-response-headers-policies-custom)
+ [移除標頭](#understanding-response-headers-policies-remove-headers)
+ [Server-Timing 標頭](#server-timing-header)

## 政策詳細資訊 (中繼資料)
<a name="understanding-response-headers-policies-details"></a>

政策詳細資訊設定包含回應標頭政策的中繼資料。
+ **名稱** - 用來識別回應標頭政策的名稱。在主控台中，您可以使用名稱將政策連接至快取行為。
+ **描述**(選用) - 用來描述回應標頭政策的註解。這是選用的設定，但它可以協助您識別政策的目的。

## CORS 標頭
<a name="understanding-response-headers-policies-cors"></a>

跨來源資源分享 (CORS) 設定可讓您在回應標頭政策中新增和設定 CORS 標頭。

此清單著重於如何在回應標頭政策中指定設定和有效值。如需進一步瞭解這些標頭以及如何實際將標頭用於 CORS 請求和回應，請參閱 MDN Web Docs 網站上的[跨原始來源資源分享](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)與 [CORS 通訊協定規格](https://fetch.spec.whatwg.org/#http-cors-protocol)。

**Access-Control-Allow-Credentials**  
這是布林值設定 (`true` 或 `false`)，用於決定 CloudFront 是否要對 CORS 請求的回應新增 `Access-Control-Allow-Credentials` 標頭。如這項設定為 `true`，CloudFront 就會對 CORS 請求的回應新增 `Access-Control-Allow-Credentials: true` 標頭，反之則不會將此標頭新增至回應。

**Access-Control-Allow-Headers**  
指定 CloudFront 用作 CORS 預檢請求回應中 `Access-Control-Allow-Headers` 標頭值的標頭名稱。此設定的有效值包括 HTTP 標頭名稱或萬用字元 (`*`)，用以表示所有標頭皆受允許。  
`Authorization` 標頭無法使用萬用字元，且必須明確列出。
    
**萬用字元的有效使用範例**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/understanding-response-headers-policies.html)

**Access-Control-Allow-Methods**  
指定 CloudFront 用作 CORS 預檢請求回應中 `Access-Control-Allow-Methods` 標頭值的 HTTP 方法。有效值包含 `GET`、`DELETE`、`HEAD`、`OPTIONS`、`PATCH`、`POST`、`PUT`、`ALL`。`ALL` 是包含所有已列出 HTTP 方法的特殊值。

**Access-Control-Allow-Origin**  
指定 CloudFront 可以在 `Access-Control-Allow-Origin` 回應標頭中使用的值。此設定的有效值包括特定原始伺服器 (例如 `http://www.example.com`)，或者代表允許所有原始伺服器的萬用字元 (`*`)。  
**備註**  
+ 允許在子網域最左邊 (`*.example.org`) 使用萬用字元 (`*`)。
+ 下列位置*不*允許使用萬用字元 (`*`)：
  + 頂層網域 (`example.*`)
  + 子網域 (`test.*.example.org`) 右側或任何子網域 (`*test.example.org`) 內
  + 條款內部 (`exa*mple.org)`
如需使用萬用字元的範例，請參閱下表。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/understanding-response-headers-policies.html)

**Access-Control-Expose-Headers**  
指定 CloudFront 用作 CORS 請求回應中 `Access-Control-Expose-Headers` 標頭值的標頭名稱。此設定的有效值包括 HTTP 標頭名稱或萬用字元 (`*`)。

**Access-Control-Max-Age**  
CloudFront 用作 CORS 請求回應中 `Access-Control-Max-Age` 標頭值的秒數。

**覆寫原始伺服器**  
布林值設定，可決定當來自原始伺服器的回應包含其中一個也在政策中的 CORS 標頭時 CloudFront 的行為。  
+ 設定為 `true`，且原始伺服器回應包含列於政策中的 CORS 標頭時，CloudFront 會將政策中的 CORS 標頭新增至回應。然後 CloudFront 會將該回應傳送給檢視器。CloudFront 會忽略從原始伺服器收到的標頭。
+ 設定為 `false`，且原始伺服器回應包含 CORS 標頭時 (無論 CORS 標頭是否列於政策中)，CloudFront 會將從原始伺服器收到的 CORS 標頭包含在回應中。CloudFront 不會將政策中的任何 CORS 標頭新增至傳送給檢視器的回應。

## 安全性標頭
<a name="understanding-response-headers-policies-security"></a>

安全性標頭設定可讓您在回應標頭政策中新增及設定數個與安全性相關的 HTTP 回應標頭。

這份清單會說明如何在回應標頭政策中指定設定和有效值，如需進一步瞭解各個標頭以及如何實際將標頭用於 HTTP 回應，請參閱 MDN Web Docs 網站上的相關連結。

**Content-Security-Policy**  
指定 CloudFront 用作 `Content-Security-Policy` 回應標頭值的內容安全性政策指令。  
如需此標頭和有效政策指令的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)。  
`Content-Security-Policy` 標頭值限制為 1783 個字元。

**推薦網站政策**  
指定 CloudFront 用作 `Referrer-Policy` 回應標頭值的推薦網站政策指令。此設定的有效值為 `no-referrer`、`no-referrer-when-downgrade`、`origin`、`origin-when-cross-origin`、`same-origin`、`strict-origin`、`strict-origin-when-cross-origin`、`unsafe-url`。  
如需此標頭和這些指令的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy)。

**Strict-Transport-Security**  
指定 CloudFront 用作 `Strict-Transport-Security` 回應標頭值的指令和設定。對於此設定，您可以分別指定：  
+ CloudFront 用作此標頭的 `max-age` 指令值的秒數
+ `preload` 的布林值設定 (`true` 或 `false`)，用於決定 CloudFront 是否要在此標頭的值中納入 `preload` 指令
+ `includeSubDomains` 的布林值設定 (`true` 或 `false`)，用於決定 CloudFront 是否要在此標頭的值中納入 `includeSubDomains` 指令
如需此標頭和這些指令的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security)。

**X-Content-Type-Options**  
這是布林值設定 (`true` 或 `false`)，用於決定 CloudFront 是否要將 `X-Content-Type-Options` 標頭新增至回應。當此設定為 `true` 時，CloudFront 會將 `X-Content-Type-Options: nosniff` 標頭新增至回應。反之則不會新增此標頭。  
如需此標頭的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options)。

**X-Frame-Options**  
指定 CloudFront 用作 `X-Frame-Options` 回應標頭值的指令。此設定的有效值為 `DENY` 或 `SAMEORIGIN`。  
如需此標頭和這些指令的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options)。

**X-XSS-Protection**  
指定 CloudFront 用作 `X-XSS-Protection` 回應標頭值的指令和設定。對於此設定，您可以分別指定：  
+ `0` (禁用 XSS 篩選) 或 `1` (啟用 XSS 篩選) 的 `X-XSS-Protection` 設定
+ `block` 的布林值設定 (`true` 或 `false`)，用於決定 CloudFront 是否要在此標頭的值中納入 `mode=block` 指令
+ 報告 URI，用於決定 CloudFront 是否要在此標頭的值中納入 `report=reporting URI` 指令
您可以將 `block` 指定為 `true`，也可以指定報告 URI，但不能同時指定兩者。如需此標頭和這些指令的詳細資訊，請參閱 MDN Web 文件中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection)。

**覆寫原始伺服器**  
每個這些安全性標頭設定均包含一個布林值設定 (`true` 或 `false`)，可決定當來自原始伺服器的回應包含此標頭時 CloudFront 的行為。  
當此設定為 `true`，且原始伺服器回應包含此標頭時，CloudFront 會將政策中的標頭新增至傳送給檢視者的回應，同時忽略從原始伺服器收到的標頭。  
當此設定為 `false`，且原始伺服器回應包含此標頭時，CloudFront 會在傳送給檢視者的回應中納入從原始伺服器收到的標頭。  
如原始伺服器回應不包含此標頭，CloudFront 會將政策中的標頭新增至傳送給檢視者的回應，無論此設定為 `true` 還是 `false` 都一樣。

## 自訂標頭
<a name="understanding-response-headers-policies-custom"></a>

自訂標頭設定可讓您在回應標頭政策中新增和設定自訂 HTTP 標頭，CloudFront 會將這些標頭新增至它傳回給檢視者的每個回應中。您可以為每個自訂標頭指定值，但不指定也沒關係，因為 CloudFront 可以新增沒有值的回應標頭。

每個自訂標頭也有自己的**原始伺服器覆寫**設定：
+ 當此設定為 `true`，且原始伺服器回應包含列於政策中的自訂標頭時，CloudFront 會將政策中的自訂標頭新增至傳送給檢視者的回應中，同時忽略從原始伺服器收到的標頭。
+ 當此設定為 `false`，且原始伺服器回應包含列於政策中的自訂標頭時，CloudFront 會在傳送給檢視者的回應中納入從原始伺服器收到的自訂標頭。
+ 如原始伺服器回應不包含列於政策中的自訂標頭，CloudFront 會將政策中的自訂標頭新增至傳送給檢視者的回應，無論此設定為 `true` 還是 `false` 都一樣。

## 移除標頭
<a name="understanding-response-headers-policies-remove-headers"></a>

您可以指定要讓 CloudFront 從原始伺服器接收到的回應中移除的標頭，如此一來，CloudFront 傳送給檢視者的回應就不會包含該標頭。CloudFront 會從傳送給檢視者的每個回應中移除標頭，無論物件是從 CloudFront 的快取或從原始伺服器提供。例如，您可以移除不使用瀏覽器的標頭 (例如 `X-Powered-By` 或 `Vary`)，以便讓 CloudFront 從傳送給檢視者的回應中移除這些標頭。

當您使用回應標頭政策指定要移除的標頭時，CloudFront 會先移除標頭，然後新增在回應標頭政策其他區段 (CORS 標頭、安全標頭、自訂標頭等) 中指定的任何標頭。若您指定了要移除的標頭，但同時在政策的另一個區段新增相同的標頭，CloudFront 會在傳送給檢視者的回應中包含該標頭。

**注意**  
您可以使用回應標頭政策移除 CloudFront 從原始伺服器接收的 `Server` 和 `Date` 標頭，如此一來，這些從原始伺服器接收的標頭就不會包含在 CloudFront 傳送給檢視者的回應中。不過，若採取此操作，CloudFront 會在傳送給檢視者的回應中新增自有的標頭版本。對於 CloudFront 新增的 `Server` 標頭，該標頭的值為 `CloudFront`。

### 您無法移除的標頭
<a name="remove-headers-disallowed"></a>

您無法使用回應標頭政策移除下列標頭。如果您在回應標頭政策 (API 中的 `ResponseHeadersPolicyRemoveHeadersConfig`) 的 **Remove headers** (移除標頭) 區段中指定這些標頭，就會收到錯誤訊息。
+ `Connection`
+ `Content-Encoding`
+ `Content-Length`
+ `Expect`
+ `Host`
+ `Keep-Alive`
+ `Proxy-Authenticate`
+ `Proxy-Authorization`
+ `Proxy-Connection`
+ `Trailer`
+ `Transfer-Encoding`
+ `Upgrade`
+ `Via`
+ `Warning`
+ `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`

## Server-Timing 標頭
<a name="server-timing-header"></a>

使用 `Server-Timing` 標頭設定啟用 CloudFront 所傳送的 HTTP 回應中的 `Server-Timing` 標頭。您可以使用這個標頭檢視有助於洞察 CloudFront 和原始伺服器行為和效能的指標。例如，您可以查看哪個快取層出現了快取命中，或是在發生快取遺漏時，查看來自原始伺服器的第一個位元組延遲時間。`Server-Timing` 標頭中的指標可以幫助您排解問題，或者測試 CloudFront 或原始伺服器組態的效率。

如需進一步瞭解透過 CloudFront 使用 `Server-Timing` 標頭，請參閱下列主題。

如要啟用 `Server-Timing` 標頭，請[建立 (或編輯) 回應標頭政策](creating-response-headers-policies.md)。

**Topics**
+ [取樣率和 Pragma 請求標頭](#server-timing-header-sampling-rate)
+ [來自原始伺服器的 Server-Timing 標頭](#server-timing-header-origin)
+ [Server-Timing 標頭指標](#server-timing-header-metrics)
+ [Server-Timing 標頭範例](#server-timing-header-examples)

### 取樣率和 Pragma 請求標頭
<a name="server-timing-header-sampling-rate"></a>

您在回應標頭政策中啟用 `Server-Timing` 標頭後，還可以指定*抽樣率*。抽樣率是介於 0 至 100 之間 (包含 0 與 100) 的數值，用於指定 CloudFront 要新增 `Server-Timing` 標頭的回應數百分比。如將抽樣率設為 100，則任何 HTTP 回應只要符合回應標頭政策所連接的快取行為，CloudFront 一律會新增 `Server-Timing` 標頭；如將抽樣率設為 50，則 CloudFront 會對符合快取行為的請求中 50% 的回應新增此標頭。您可以將抽樣率設定為 0 至 100 之間的任何數值，最多可精確到小數點後四位數字。

當抽樣率設定為低於 100 的數值時，您無法控管 CloudFront 會對哪些回應新增 `Server-Timing` 標頭，只能掌握有多少百分比的回應會加上標頭。不過，假如您為 HTTP 請求新增 `Pragma` 標頭，並將值設定為 `server-timing`，那麼該請求的回應便會一定收到 `Server-Timing` 標頭，無論抽樣率設為多少都一樣；即使抽樣率設為零 (0)，只要是包含 `Pragma: server-timing` 標頭的請求，CloudFront 一律會對其回應加上 `Server-Timing` 標頭。

### 來自原始伺服器的 Server-Timing 標頭
<a name="server-timing-header-origin"></a>

發生快取遺漏且 CloudFront 轉送請求到原始伺服器時，原始伺服器可能包含 `Server-Timing` 標頭在其對 CloudFront 的回應中。在這種情況下，CloudFront 會新增其[指標](#server-timing-header-metrics)到從原始伺服器收到的 `Server-Timing` 標頭。CloudFront 傳送給檢視器的回應包含單一回應 `Server-Timing` 標頭，其中包含來自原始伺服器的值以及 CloudFront 新增的指標。來自原始伺服器的標頭值可能位於結尾，或介於 CloudFront 新增至標頭的兩組指標之間。

發生快取命中時，CloudFront 傳送給檢視器的回應會包含單一 `Server-Timing` 標頭，其標頭值中僅包含 CloudFront 指標 (不包含來自原始伺服器的值)。

### Server-Timing 標頭指標
<a name="server-timing-header-metrics"></a>

如 CloudFront 對 HTTP 回應新增了 `Server-Timing` 標頭，標頭的值會包含一或多項指標，可協助您獲得 CloudFront 和原始伺服器行為及效能相關的洞察。以下清單包含所有指標及其可能的值；`Server-Timing` 標頭僅含有其中一些指標，實際情況取決於 CloudFront 收到的請求和提供的回應所具備的性質。

`Server-Timing` 標頭中的部分指標僅有名稱 (沒有值)，有些指標則有名稱和一個值。如果指標具有值，名稱和值之間會以半形分號分隔 (`;`)；假如標頭包含多個指標，則各個指標之間會以半形逗號分隔 (`,`)。

**cdn-cache-hit**  
CloudFront 提供了來自快取的回應，沒有向原始伺服器提出請求。

**cdn-cache-refresh**  
CloudFront 向原始伺服器提出請求，確認快取物件仍然有效後，提供了來自快取的回應。在這種情況下，CloudFront 並未從原始伺服器擷取完整物件。

**cdn-cache-miss**  
CloudFront 沒有提供來自快取的回應。在這種情況下，CloudFront 在傳回回應之前，先向原始伺服器請求過完整物件。

**cdn-pop**  
包含一個值，用於描述哪個 CloudFront 連接點 (POP) 負責處理請求。

**cdn-rid**  
包含一個值，為該請求的 CloudFront 唯一識別符。透過 支援排解問題時，您可以使用這個請求標識符 (RID)

**cdn-hit-layer**  
當 CloudFront 在沒有向原始伺服器提出請求的情況下提供了來自快取的回應，就會出現這個指標。包含以下其中一個值：  
+ **EDGE** – CloudFront 提供了來自 POP 位置的快取回應。
+ **REC** – CloudFront 提供了來自[區域節點快取](HowCloudFrontWorks.md#CloudFrontRegionaledgecaches) (REC) 位置的快取回應。
+ **Origin Shield** – CloudFront 提供了做為 [Origin Shield](origin-shield.md) 的 REC 傳送的快取回應。

**cdn-upstream-layer**  
如 CloudFront 向原始伺服器請求了完整物件，就會出現這個指標；指標會包含下列其中一個值：  
+ **EDGE** – POP 位置將請求直接傳送給了原始伺服器。
+ **REC** – REC 位置將請求直接傳送給了原始伺服器。
+ **Origin Shield** – 做為 [Origin Shield](origin-shield.md) 的 REC 將請求直接傳送給了原始伺服器。

**cdn-upstream-dns**  
包含一個值，用於表示從原始伺服器擷取 DNS 記錄所花費的毫秒數。假如該值為零 (0)，代表 CloudFront 使用的是快取 DNS 結果，或者重複使用了現有連線。

**cdn-upstream-connect**  
包含一個值，用於表示完成原始伺服器 DNS 請求以及 TCP (與 TLS，如有) 完成原始伺服器連線之間所花費的毫秒數。假如該值為零 (0)，代表 CloudFront 重複使用了現有連線。

**cdn-upstream-fbl**  
包含一個值，用於表示完成原始伺服器 HTTP 請求以及來自原始伺服器的回應收到第一個位元組之間所花費的毫秒數 (第一個位元組延遲時間)。

**cdn-downstream-fbl**  
包含一個值，用於表示邊緣節點完成收到請求以及將回應的第一個位元組傳送給檢視者之間所花費的毫秒數。

### Server-Timing 標頭範例
<a name="server-timing-header-examples"></a>

下列範例顯示 `Server-Timing` 標頭設定啟用後，檢視者可能從 CloudFront 收到的 `Server-Timing` 標頭。

**Example – 快取遺漏**  
下列範例顯示當 CloudFront 快取中沒有請求的物件，檢視者可能會收到的 `Server-Timing` 標頭。  

```
Server-Timing: cdn-upstream-layer;desc="EDGE",cdn-upstream-dns;dur=0,cdn-upstream-connect;dur=114,cdn-upstream-fbl;dur=177,cdn-cache-miss,cdn-pop;desc="PHX50-C2",cdn-rid;desc="yNPsyYn7skvTzwWkq3Wcc8Nj_foxUjQUe9H1ifslzWhb0w7aLbFvGg==",cdn-downstream-fbl;dur=436
```
此 `Server-Timing` 標頭表示以下內容：  
+ 原始伺服器請求是從 CloudFront 連接點 (POP) 位置傳送的 (`cdn-upstream-layer;desc="EDGE"`)。
+ CloudFront 使用了原始伺服器的快取 DNS 結果 (`cdn-upstream-dns;dur=0`)。
+ CloudFront 花了 114 毫秒才完成與原始伺服器的 TCP (及 TLS，如有) 連線 (`cdn-upstream-connect;dur=114`)。
+ 完成請求後，CloudFront 花了 177 毫秒才從原始伺服器收到回應的第一個位元組 (`cdn-upstream-fbl;dur=177`)。
+ CloudFront 的快取中沒有請求的物件 (`cdn-cache-miss`)。
+ 請求是由 `PHX50-C2` 代碼識別的節點接收的 (`cdn-pop;desc="PHX50-C2"`)。
+ 此請求的 CloudFront 唯一 ID 是 `yNPsyYn7skvTzwWkq3Wcc8Nj_foxUjQUe9H1ifslzWhb0w7aLbFvGg==` (`cdn-rid;desc="yNPsyYn7skvTzwWkq3Wcc8Nj_foxUjQUe9H1ifslzWhb0w7aLbFvGg=="`)。
+ CloudFront 在收到檢視器要求後，將回應的第一個位元組傳送給檢視器，花了 436 毫秒 (`cdn-downstream-fbl;dur=436`)。

**Example – 快取命中**  
下列範例顯示當 CloudFront 快取中含有請求的物件，檢視者可能會收到的 `Server-Timing` 標頭。  

```
Server-Timing: cdn-cache-hit,cdn-pop;desc="SEA19-C1",cdn-rid;desc="nQBz4aJU2kP9iC3KHEq7vFxfMozu-VYBwGzkW9diOpeVc7xsrLKj-g==",cdn-hit-layer;desc="REC",cdn-downstream-fbl;dur=137
```
此 `Server-Timing` 標頭表示以下內容：  
+ 快取中含有請求的物件 (`cdn-cache-hit`)。
+ 請求是由 `SEA19-C1` 代碼識別的節點接收的 (`cdn-pop;desc="SEA19-C1"`)。
+ 此請求的 CloudFront 唯一 ID 是 `nQBz4aJU2kP9iC3KHEq7vFxfMozu-VYBwGzkW9diOpeVc7xsrLKj-g==` (`cdn-rid;desc="nQBz4aJU2kP9iC3KHEq7vFxfMozu-VYBwGzkW9diOpeVc7xsrLKj-g=="`)。
+ 請求的物件是在區域節點快取 (REC) 位置進行快取的 (`cdn-hit-layer;desc="REC"`)。
+ CloudFront 在收到檢視器要求後，將回應的第一個位元組傳送給檢視器，花了 137 毫秒 (`cdn-downstream-fbl;dur=137`)。