

# 了解响应标头策略
<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` 标头。否则，CloudFront 不会在响应中添加此标头。

**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_cn/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_cn/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 Docs 中的 [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 个字符。

**Referrer-Policy**  
指定 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 Docs 中的 [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 Docs 中的 [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` 标头。否则，CloudFront 不会添加此标头。  
有关此标头的更多信息，请参阅 MDN Web Docs 中的 [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 Docs 中的 [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` 响应标头的值的指令和设置。对于此设置，您可以单独指定：  
+ `X-XSS-Protection` 设置为 `0`（禁用 XSS 筛选）或 `1`（启用 XSS 筛选）
+ `block` 的布尔值设置（`true` 或 `false`），它决定了 CloudFront 是否在此标头的值中包括 `mode=block` 指令
+ 报告 URI，它决定了 CloudFront 是否在此标头的值中包括 `report=reporting URI` 指令
您可以为 `block` 指定 `true`，也可以指定一个报告 URI，但是不能同时指定这两者。有关此标头和这些指引的更多信息，请参阅 MDN Web Docs 中的 [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` 时，CloudFront 都会执行此操作。

## 自定义标头
<a name="understanding-response-headers-policies-custom"></a>

您可以使用自定义标头设置在响应标头策略中添加和配置自定义的 HTTP 标头。CloudFront 会将这些标头添加到它返回给查看器的每个响应中。对于每个自定义标头，您还可以指定标头的值，但指定值的步骤是可选的。这是因为 CloudFront 可以添加一个没有值的响应标头。

每个自定义标头也有自身的**源覆盖**设置：
+ 如果此设置设为 `true` 并且源响应中包含策略中也包含的自定义标头，CloudFront 会将策略中的自定义标头添加到它发送给查看器的响应中。它忽略从源收到的标头。
+ 如果此设置为 `false` 并且源响应中包含策略中也包含的自定义标头，CloudFront 会将它从源收到的自定义标头包含在它发送给查看器的响应中。
+ 如果源响应中不包含策略中所包含的自定义标头，CloudFront 会将策略中的自定义标头添加到它发送给查看器的响应中。当此设置设为 `true` 或 `false` 时，CloudFront 都会执行此操作。

## 删除标头
<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`）的**删除标头**部分指定这些标头，则会收到错误。
+ `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 或源配置的效率。

有关结合使用 `Server-Timing` 标头与 CloudFront 的更多信息，请参阅以下主题。

要启用 `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（含）之间的一个数字，它指定您希望 CloudFront 将 `Server-Timing` 标头添加到其中的响应的百分比。当您将采样率设置为 100 时，CloudFront 会针对每个与响应标头策略附加到的缓存行为相匹配的请求，将 `Server-Timing` 标头添加到对应的 HTTP 响应中。当您将其设置为 50 时，CloudFront 会将此标头添加到与缓存行为匹配的请求的 50% 的响应中。您可以将采样率设置为 0–100 之间的任意数字，最多保留四位小数。

当采样率设置为低于 100 的数字时，您无法控制 CloudFront 将 `Server-Timing` 标头添加到哪些响应中，只能控制百分比。但是，您可以在 HTTP 请求中添加值设置为 `server-timing` 的 `Pragma` 标头，以便在对该请求的响应中接收 `Server-Timing` 标头。无论采样率设置为多少，这一点都适用。即使采样率设为零（0），如果请求包含 `Pragma: server-timing` 标头，CloudFront 也会将 `Server-Timing` 标头添加到响应中。

### 源中的 Server-Timing 标头
<a name="server-timing-header-origin"></a>

当缓存未命中且 CloudFront 将请求转发到源时，源可能会在至 CloudFront 的响应中包含 `Server-Timing` 标头。在这种情况下，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 将 `Server-Timing` 标头添加到 HTTP 响应时，标头的值包含一个或多个指标，它们可以帮助您深入了解 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`）。