

# 使用策略在 CloudFront 响应中添加或删除 HTTP 标头
<a name="modifying-response-headers"></a>

您可以配置 CloudFront 以修改它发送给查看器（Web 浏览器和其他客户端）的响应中的 HTTP 标头。在将响应发送给查看器之前，CloudFront 可以删除从源接收到的标头，或者在响应中添加标头。进行这些更改不需要编写代码或更改源。

例如，您可以删除 `X-Powered-By` 和 `Vary` 等标头，以便 CloudFront 在发送给查看器的响应中不包含这些标头。或者，您可以添加 HTTP 标头，例如：
+ 用于控制浏览器缓存的 `Cache-Control` 标头。
+ 用于启用跨源资源共享 (CORS) 的 `Access-Control-Allow-Origin` 标头。您还可以添加其他 CORS 标头。
+ 一组常见的安全标头，例如 `Strict-Transport-Security`、`Content-Security-Policy` 和 `X-Frame-Options`。
+ `Server-Timing` 标头，可通过 CloudFront 查看与请求和响应的性能和路由相关的信息。

要指定 CloudFront 在 HTTP 响应中添加或删除的标头，您可以使用*响应标头策略*。您可以将响应标头策略附加到另一个*缓存行为*，CloudFront 会修改它发送给匹配缓存行为的请求的响应中的标头。CloudFront 修改它从缓存中提供的响应中的标头和它从源转发的标头。如果源响应中包含响应标头策略中添加的一个或多个标头，则此策略可以指定 CloudFront 是使用从源接收的标头，还是用响应标头策略中的标头覆盖该标头。

**注意**  
如果您在响应标头策略中添加用于控制浏览器缓存的标头（例如 `Cache-Control`），CloudFront 仅将这些标头添加到*查看器响应* 中。这些标头不会影响 CloudFront 缓存所请求对象的方式。

CloudFront 为常见的使用案例提供了预定义的响应标头策略（称为*托管式策略*）。您可以[使用这些托管式策略](using-managed-response-headers-policies.md)，也可以创建您自己的策略。您可以将单个响应标头策略附加到您的 AWS 账户 中多个分配的多个缓存行为。

有关更多信息，请参阅下列内容：

**Topics**
+ [了解响应标头策略](understanding-response-headers-policies.md)
+ [创建响应标头策略](creating-response-headers-policies.md)
+ [使用托管式响应标头策略](using-managed-response-headers-policies.md)

# 了解响应标头策略
<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`）。

# 创建响应标头策略
<a name="creating-response-headers-policies"></a>

可以使用响应标头策略指定 Amazon CloudFront 在 HTTP 响应中添加或删除的 HTTP 标头。有关响应标头策略以及使用它们的原因的更多信息，请参阅[使用策略在 CloudFront 响应中添加或删除 HTTP 标头](modifying-response-headers.md)。

您可以在 CloudFront 控制台中创建响应标头策略。或者，您可以使用 AWS CloudFormation、AWS Command Line Interface（AWS CLI）或 CloudFront API 创建一个标头。创建响应标头策略后，将它附加到 CloudFront 分配中的一个或多个缓存行为。

在创建自定义响应标头策略之前，检查是否有某个[托管式响应标头策略](using-managed-response-headers-policies.md)适合您的使用案例。如果有，则可以将它附加到缓存行为。这样，您就不需要创建或管理自己的响应标头策略。

------
#### [ Console ]

**创建响应标头策略（控制台）**

1. 登录到AWS 管理控制台，打开 CloudFront 控制台（地址为 [https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders)）的 **Policies**（策略）页面，转到 **Response headers**（响应标头）选项卡。

1. 选择 **Create response headers policy**（创建响应标头策略）。

1. 在 **Create response headers policy**（创建响应标头策略）表单中，执行以下操作：

   1. 在 **Details**（详细信息）面板中，输入响应标头策略的 **Name**（名称）和（可选）解释策略用途的 **Description**（描述）。

   1. 在 **Cross-origin resource sharing (CORS)** [跨源资源共享（CORS）]面板中，选择 **Configure CORS**（配置 CORS）切换按钮并配置要添加到策略的任何 CORS 标头。如果您希望配置的标头覆盖 CloudFront 从源接收的标头，请选中 **Origin override**（源覆盖）复选框。

      有关 CORS 标头设置的更多信息，请参阅[CORS 标头](understanding-response-headers-policies.md#understanding-response-headers-policies-cors)。

   1. 在 **Security headers**（安全标头）面板中，选择切换按钮并配置要添加到策略的每个安全标头。

      有关安全标头设置的更多信息，请参阅[安全标头](understanding-response-headers-policies.md#understanding-response-headers-policies-security)。

   1. 在 **Custom headers**（自定义标头）面板中，添加要包含在策略中的任何自定义标头。

      有关自定义标头设置的更多信息，请参阅[自定义标头](understanding-response-headers-policies.md#understanding-response-headers-policies-custom)。

   1. 在 **Remove headers**（删除标头）面板中，添加您希望 CloudFront 从源响应中删除的且不包含在 CloudFront 发送给查看器的响应中的所有标头名称。

      有关删除标头设置的更多信息，请参阅[删除标头](understanding-response-headers-policies.md#understanding-response-headers-policies-remove-headers)。

   1. 在 **Server-Timing header**（Server-Timing 标头）面板中，选择 **Enable**（启用）开关并输入采样率（0 到 100（含）之间的数字）。

      有关 `Server-Timing` 标头的更多信息，请参阅[Server-Timing 标头](understanding-response-headers-policies.md#server-timing-header)。

1. 选择 **Create**（创建）以创建策略。

创建响应标头策略后，您可以将它附加到 CloudFront 分配中的某个缓存行为。

**将响应标头策略附加到现有分配（控制台）**

1. 在 CloudFront 控制台中打开 **Distributions (分配)** 页面，网址为 [https://console.aws.amazon.com/cloudfront/v4/home#/distributions](https://console.aws.amazon.com/cloudfront/v4/home#/distributions)。

1. 选择要更新的分配，然后选择**行为**选项卡。

1. 选择要更新的缓存行为，然后选择 **Edit**（编辑）。

   或者，要创建新的缓存行为，请选择 **Create behavior**(创建行为)。

1. 对于 **Response headers policy**（响应标头策略），选择要添加到缓存行为的策略。

1. 选择 **Save changes**（保存更改）以更新缓存行为。如果要创建新的缓存行为，请选择 **Create behavior**（创建行为）。

**将响应标头策略附加到新的分配（控制台）**

1. 通过 打开 CloudFront 控制台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. 选择 **Create distribution**（创建分配）。

1. 对于 **Response headers policy**（响应标头策略），选择要添加到缓存行为的策略。

1. 选择分配的其他设置。有关更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md)。

1. 选择 **Create distribution**（创建分配）以创建分配。

------
#### [ CloudFormation ]

要使用 CloudFormation 创建响应标头策略，请使用 `AWS::CloudFront::ResponseHeadersPolicy` 资源类型。以下示例显示了 YAML 格式的 CloudFormation 模板语法，用于创建响应标头策略。

```
Type: AWS::CloudFront::ResponseHeadersPolicy
Properties: 
  ResponseHeadersPolicyConfig: 
    Name: EXAMPLE-Response-Headers-Policy
    Comment: Example response headers policy for the documentation
    CorsConfig: 
      AccessControlAllowCredentials: false
      AccessControlAllowHeaders: 
        Items: 
          - '*'
      AccessControlAllowMethods: 
        Items: 
          - GET
          - OPTIONS
      AccessControlAllowOrigins: 
        Items: 
          - https://example.com
          - https://docs.example.com
      AccessControlExposeHeaders: 
        Items: 
          - '*'
      AccessControlMaxAgeSec: 600
      OriginOverride: false
    CustomHeadersConfig: 
      Items: 
        - Header: Example-Custom-Header-1
          Value: value-1
          Override: true
        - Header: Example-Custom-Header-2
          Value: value-2
          Override: true
    SecurityHeadersConfig: 
      ContentSecurityPolicy: 
        ContentSecurityPolicy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'; frame-ancestors 'none'
        Override: false
      ContentTypeOptions: # You don't need to specify a value for 'X-Content-Type-Options'.
                          # Simply including it in the template sets its value to 'nosniff'.
        Override: false
      FrameOptions: 
        FrameOption: DENY
        Override: false
      ReferrerPolicy: 
        ReferrerPolicy: same-origin
        Override: false
      StrictTransportSecurity: 
        AccessControlMaxAgeSec: 63072000
        IncludeSubdomains: true
        Preload: true
        Override: false
      XSSProtection: 
        ModeBlock: true # You can set ModeBlock to 'true' OR set a value for ReportUri, but not both
        Protection: true
        Override: false
    ServerTimingHeadersConfig:
      Enabled: true
      SamplingRate: 50
    RemoveHeadersConfig:
      Items:
        - Header: Vary
        - Header: X-Powered-By
```

有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [AWS::CloudFront::ResponseHeadersPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-responseheaderspolicy.html)。

------
#### [ CLI ]

要使用 AWS Command Line Interface（AWS CLI）创建响应标头策略，请使用 **aws cloudfront create-response-headers-policy** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建响应标头策略（通过 CLI 并使用输入文件）**

1. 使用以下命令创建名为 `response-headers-policy.yaml` 的文件。此文件包含 **create-response-headers-policy** 命令的所有输入参数。

   ```
   aws cloudfront create-response-headers-policy --generate-cli-skeleton yaml-input > response-headers-policy.yaml
   ```

1. 打开刚创建的 `response-headers-policy.yaml` 文件。编辑文件以指定策略名称和所需的响应标头策略配置，然后保存文件。

   有关响应标头策略设置的更多信息，请参阅[了解响应标头策略](understanding-response-headers-policies.md)。

1. 使用以下命令创建响应标头策略。您创建的策略使用来自 `response-headers-policy.yaml` 文件的输出参数。

   ```
   aws cloudfront create-response-headers-policy --cli-input-yaml file://response-headers-policy.yaml
   ```

   记下命令输出中的 `Id` 值。这是响应标头策略 ID。您需要它才能将策略附加到 CloudFront 分配的缓存行为。

**将响应标头策略附加到现有分配（通过 CLI 并使用输入文件）**

1. 使用以下命令保存要更新的 CloudFront 分配的分配配置。将 *distribution\$1ID* 替换为分配 ID。

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑此文件，对缓存行为进行以下更改以使它使用响应标头策略。
   + 在缓存行为中，添加名为 `ResponseHeadersPolicyId` 的字段。对于字段的值，请使用创建策略后记下的响应标头策略 ID。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令将分配更新为使用响应标头策略。将 *distribution\$1ID* 替换为分配 ID。

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

**将响应标头策略附加到新的分配（通过 CLI 并使用输入文件）**

1. 使用以下命令创建名为 `distribution.yaml` 的文件。此文件包含 **create-distribution** 命令的所有输入参数。

   ```
   aws cloudfront create-distribution --generate-cli-skeleton yaml-input > distribution.yaml
   ```

1. 打开刚创建的 `distribution.yaml` 文件。在默认缓存行为中，在 `ResponseHeadersPolicyId` 字段中输入创建策略后记下的响应标头策略 ID。继续编辑该文件以指定所需的分配设置，然后在完成后保存该文件。

   有关分配设置的更多信息，请参阅[所有分配设置参考](distribution-web-values-specify.md)。

1. 使用以下命令通过 `distribution.yaml` 文件中的输入参数创建分配。

   ```
   aws cloudfront create-distribution --cli-input-yaml file://distribution.yaml
   ```

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

要使用 CloudFront API 创建响应标头策略，请使用 [CreateResponseHeadersPolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateResponseHeadersPolicy.html)。有关您在此 API 调用中指定的字段的更多信息，请参阅[了解响应标头策略](understanding-response-headers-policies.md)以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

创建响应标头策略后，可以使用下面的任何一个 API 调用将其附加到缓存行为：
+ 要将该配置附加到现有分配中的缓存行为，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将该配置附加到新分配中的缓存行为，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 调用，请在缓存行为内的 `ResponseHeadersPolicyId` 字段中提供响应标头策略 ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

# 使用托管式响应标头策略
<a name="using-managed-response-headers-policies"></a>

借助 CloudFront 响应标头策略，您可以指定 Amazon CloudFront 将在它发送给查看器的响应中删除或添加的 HTTP 标头。有关响应标头策略以及使用它们的原因的更多信息，请参阅[使用策略在 CloudFront 响应中添加或删除 HTTP 标头](modifying-response-headers.md)。

CloudFront 提供的托管式响应标头策略可以附加到 CloudFront 分配中的缓存行为。借助托管式响应标头策略，您无需编写或维护自己的策略。托管式策略包含针对常见使用案例的一组 HTTP 响应标头。

要使用托管式响应标头策略，您需要将它附加到分配中的缓存行为。此过程与创建自定义响应标头策略的过程相同。但是，您不需要创建新策略，只需附加其中一个托管式策略即可。您可以按名称（使用控制台）或 ID（使用 CloudFormation、AWS CLI或AWS开发工具包）来附加策略。以下部分列出了名称和 ID。

有关更多信息，请参阅 [创建响应标头策略](creating-response-headers-policies.md)。

下面的主题介绍了您可以使用的托管响应标头策略。

**Topics**
+ [CORS-and-SecurityHeadersPolicy](#managed-response-headers-policies-cors-security)
+ [CORS-With-Preflight](#managed-response-headers-policies-cors-preflight)
+ [CORS-with-preflight-and-SecurityHeadersPolicy](#managed-response-headers-policies-cors-preflight-security)
+ [SecurityHeadersPolicy](#managed-response-headers-policies-security)
+ [SimpleCORS](#managed-response-headers-policies-cors)

## CORS-and-SecurityHeadersPolicy
<a name="managed-response-headers-policies-cors-security"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders/e61eb60c-9c35-4d20-a928-2b84e02af89c)

使用此托管式策略以允许来自任何源的简单 CORS 请求。此策略还会在 CloudFront 发送给查看器的所有响应中添加一组安全标头。此策略将 [SimpleCORS](#managed-response-headers-policies-cors) 和 [SecurityHeadersPolicy](#managed-response-headers-policies-security) 策略组合为一个策略。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`e61eb60c-9c35-4d20-a928-2b84e02af89c`


**策略设置**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html)

## CORS-With-Preflight
<a name="managed-response-headers-policies-cors-preflight"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders/5cc3b908-e619-4b99-88e5-2cf7f45965bd)

使用此托管式策略以允许来自任何源的 CORS 请求，包括预检请求。对于预检请求（使用 HTTP `OPTIONS` 方法），CloudFront 会将下面的三个标头全部添加到响应中。对于简单 CORS 请求，CloudFront 将只添加 `Access-Control-Allow-Origin` 标头。

如果 CloudFront 从源收到的响应包括其中的任何标头，CloudFront 将在它对查看器的响应中使用收到的标头（及其值）。CloudFront 在此策略中不使用标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`5cc3b908-e619-4b99-88e5-2cf7f45965bd`


**策略设置**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html)

## CORS-with-preflight-and-SecurityHeadersPolicy
<a name="managed-response-headers-policies-cors-preflight-security"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders/eaab4381-ed33-4a86-88ca-d9558dc6cd63)

使用此托管式策略以允许来自任何源的 CORS 请求。这包括预检请求。此策略还会在 CloudFront 发送给查看器的所有响应中添加一组安全标头。此策略将 [CORS-With-Preflight](#managed-response-headers-policies-cors-preflight) 和 [SecurityHeadersPolicy](#managed-response-headers-policies-security) 策略组合为一个策略。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`eaab4381-ed33-4a86-88ca-d9558dc6cd63`


**策略设置**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html)

## SecurityHeadersPolicy
<a name="managed-response-headers-policies-security"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders/67f7725c-6f97-4210-82d7-5512b31e9d03)

使用此托管式策略以在 CloudFront 发送给查看器的所有响应中添加一组安全标头。有关这些安全标头的更多信息，请参阅 [Mozilla 的 Web 安全指南](https://infosec.mozilla.org/guidelines/web_security)。

借助此响应标头策略，CloudFront 将 `X-Content-Type-Options: nosniff` 添加到所有响应中。当 CloudFront 从源收到的响应包含或不包含此标头时，都是这种情况。对于此策略中的所有其他标头，如果 CloudFront 从源收到的响应包括该标头，CloudFront 将在它对查看器的响应中使用收到的标头（及其值）。它在此策略中不使用标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`67f7725c-6f97-4210-82d7-5512b31e9d03`


**策略设置**  
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html)

## SimpleCORS
<a name="managed-response-headers-policies-cors"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/responseHeaders/60669652-455b-4ae9-85a4-c4c02393f86c)

使用此托管式策略以允许来自任何源的[简单 CORS 请求](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)。使用此策略时，CloudFront 会在简单 CORS 请求的所有响应中添加标头 `Access-Control-Allow-Origin: *`。

如果 CloudFront 从源收到的响应包括 `Access-Control-Allow-Origin` 标头，CloudFront 将在它对查看器的响应中使用该标头（及其值）。CloudFront 在此策略中不使用标头。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`60669652-455b-4ae9-85a4-c4c02393f86c`


**策略设置**  

|  | 标头名称 | 标头值 | 覆盖源？ | 
| --- | --- | --- | --- | 
| CORS 标头： | Access-Control-Allow-Origin | \$1 | 否 | 