了解响应标头策略 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

了解响应标头策略

使用响应标头策略,您可以指定 Amazon CloudFront 添加到它发送给查看器的响应中的 HTTP 标头。有关响应标头策略以及使用它们的原因的更多信息,请参阅将 HTTP 标头添加到 CloudFront 响应

以下主题解释了响应标头策略中的设置。这些设置分为下面的主题所代表的类别。

策略详细信息(元数据)

策略详细信息设置包含有关响应标头策略的元数据。

  • Name(名称)– 用于标识响应标头策略的名称。在控制台中,南滨可以使用名称将策略附加到某个缓存行为。

  • Description(描述)(可选)– 用于描述响应标头策略的注释。虽然此选项是可选的,但它可以帮助您确定策略的用途。

CORS 标头

跨源资源共享(CORS)设置允许您在响应标头策略中添加和配置 CORS 标头。

此列表关注的是如何在响应标头策略中指定设置和有效值。有关各个标头以及如何在真实的 CORS 请求和响应中使用它们的更多信息,请参阅 MDN Web Docs 中的跨源资源共享CORS 协议规范

  • Access-Control-Allow-Credentials – 这是一个布尔值设置(truefalse),它决定 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 标头名称或通配符 (*)。

  • Access-Control-Allow-Methods – 指定 CloudFront 在 CORS 预检请求的响应中用作 Access-Control-Allow-Methods 标头的值的 HTTP 方法。有效值为 GETDELETEHEADOPTIONSPATCHPOSTPUTALL(全部)。ALL 是一个包含所有列出的 HTTP 方法的特殊值。

  • Access-Control-Allow-Origin – 指定 CloudFront 可以在 Access-Control-Allow-Origin 响应标头中使用的值。此设置的有效值包括特定的源(例如 https://www.example.com)或通配符 (*)(这表示允许所有源)。

  • Access-Control-Expose-Headers – 指定 CloudFront 在 CORS 请求的响应中用作 Access-Control-Expose-Headers 标头的值的标头名称。此设置的有效值包括 HTTP 标头名称或通配符 (*)。

  • Access-Control-Max-Age – CloudFront 在 CORS 预检请求的响应中用作 Access-Control-Max-Age 标头的值的秒数。

  • Origin override(源覆盖)– 这是一个布尔值设置(truefalse),它决定了当来自源的响应中包含策略中也包含的某个 CORS 标头时 CloudFront 的行为方式。

    如果此设置设为 true 并且源响应中包含策略中也包含的 CORS 标头,CloudFront 会将策略中的 CORS 标头添加到它发送给查看器的响应中。它忽略从源收到的标头。

    如果此设置为 false 并且源响应中包含策略中也包含的 CORS 标头,CloudFront 会将它从源收到的 CORS 标头包含在它发送给查看器的响应中。

    当源响应不包含位于策略中的 CORS 标头时,CloudFront 会将策略中的 CORS 标头添加到它发送给查看器的响应中。当此设置设为 truefalse 时,CloudFront 都会执行此操作。

安全标头

可以使用安全标头设置在响应标头策略中添加和配置多个与安全相关的 HTTP 响应标头。

此列表描述如何在响应标头策略中指定设置和有效值。有关各个标头以及如何在真实的 HTTP 响应中使用它们的更多信息,请参阅 MDN Web Docs 链接。

  • Content-Security-Policy – 指定 CloudFront 用作 Content-Security-Policy 响应标头的值的内容安全策略指引。

    有关此标头和有效策略指引的更多信息,请参阅 MDN Web Docs 中的 Content-Security-Policy

    注意

    Content-Security-Policy 标头值的长度限制为 1783 个字符。

  • Referrer-Policy – 指定 CloudFront 用作 Referrer-Policy 响应标头的值的引用站点策略指引。此设置的有效值为 no-referrerno-referrer-when-downgradeoriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-originunsafe-url

    有关此标头和这些指引的更多信息,请参阅 MDN Web Docs 中的 Referrer-Policy

  • Strict-Transport-Security – 指定 CloudFront 用作 Strict-Transport-Security 响应标头的值的指引和设置。对于此设置,您可以单独指定:

    • CloudFront 用作此标头的 max-age 指令的值的秒数

    • preload 的布尔值设置(truefalse),它决定了 CloudFront 是否在此标头的值中包括 preload 指令

    • includeSubDomains 的布尔值设置(truefalse),它决定了 CloudFront 是否在此标头的值中包括 includeSubDomains 指令

    有关此标头和这些指引的更多信息,请参阅 MDN Web Docs 中的 Strict-Transport-Security

  • X-Content-Type-Options – 这是一个布尔值设置(truefalse),它决定了 CloudFront 是否在响应中添加 X-Content-Type-Options 标头。如果此设置为 true,CloudFront 会在响应中添加 X-Content-Type-Options: nosniff 标头。否则,CloudFront 不会添加此标头。

    有关此标头的更多信息,请参阅 MDN Web Docs 中的 X-Content-Type-Options

  • X-Frame-Options – 指定 CloudFront 用作 X-Frame-Options 响应标头的值的指引。此设置的有效值为 DENYSAMEORIGIN

    有关此标头和这些指引的更多信息,请参阅 MDN Web Docs 中的 X-Frame-Options

  • X-XSS-Protection – 指定 CloudFront 用作 X-XSS-Protection 响应标头的值的指引和设置。对于此设置,您可以单独指定:

    • X-XSS-Protection 设置为 0(禁用 XSS 筛选)或 1(启用 XSS 筛选)

    • block 的布尔值设置(truefalse),它决定了 CloudFront 是否在此标头的值中包括 mode=block 指令

    • 报告 URI,它决定了 CloudFront 是否在此标头的值中包括 report=reporting URI 指令

    您可以为 block 指定 true,也可以指定一个报告 URI,但是不能同时指定这两者。有关此标头和这些指引的更多信息,请参阅 MDN Web Docs 中的 X-XSS-Protection

  • Origin override(源覆盖)– 这些安全标头均包含一个布尔值设置(truefalse),它决定了当来自源的响应中包含该标头时 CloudFront 的行为方式。

    如果此设置设为 true 并且源响应中包含此标头,CloudFront 会将策略中的标头添加到它发送给查看器的响应中。它忽略从源收到的标头。

    如果此设置设为 false 并且源响应中包含此标头,CloudFront 会将它从源收到的标头包含在它发送给查看器的响应中。

    当源响应不包含此标头时,CloudFront 会将策略中的标头添加到它发送给查看器的响应中。当此设置设为 truefalse 时,CloudFront 都会执行此操作。

自定义标头

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

每个自定义标头也有自己的 Origin override(源覆盖)设置:

  • 如果此设置设为 true 并且源响应中包含策略中也包含的自定义标头,CloudFront 会将策略中的自定义标头添加到它发送给查看器的响应中。它忽略从源收到的标头。

  • 如果此设置为 false 并且源响应中包含策略中也包含的自定义标头,CloudFront 会将它从源收到的自定义标头包含在它发送给查看器的响应中。

  • 如果源响应中不包含策略中所包含的自定义标头,CloudFront 会将策略中的自定义标头添加到它发送给查看器的响应中。当此设置设为 truefalse 时,CloudFront 都会执行此操作。

Server-Timing 标头

使用 Server-Timing 标头设置在从 CloudFront 发送的 HTTP 响应中启用 Server-Timing 标头。您可以使用此标头查看指标,这些指标可以帮助您深入了解 CloudFront 和源的行为和性能。例如,您可以看到哪个缓存层提供了缓存命中。或者,如果存在缓存未命中,您可以看到源中的第一个字节延迟。Server-Timing 标头中的指标可以帮助您排查问题或测试 CloudFront 或源配置的效率。

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

要启用 Server-Timing 标头,请创建(或编辑)响应标头策略

采样率和 Pragma 请求标头

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

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

源中的的 Server-Timing 标头

当缓存未命中且 CloudFront 将请求转发到源时,源可能会在至 CloudFront 的响应中包含 Server-Timing 标头。在这种情况下,CloudFront 将其指标添加到它从源接收到的 Server-Timing 标头中。CloudFront 发送给查看者的响应包含一个 Server-Timing 标头,其中包含来自源的值和 CloudFront 添加的指标。源中的标头值可能位于末尾,或者介于 CloudFront 添加到标头的两组指标之间。

当出现缓存命中时,CloudFront 发送给查看者的响应将包含一个 Server-Timing 标头,其中的标头值中仅包含 CloudFront 指标(不包括源中的值)。

Server-Timing 标头指标

当 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 唯一标识符。当通过 Amazon Web Services Support 排查问题时,可以使用此请求标识符 (RID)。

  • cdn-hit-layer – 当 CloudFront 从缓存中提供响应而不向源发出请求时,此指标存在。它包含下列值之一:

    • EDGE – CloudFront 提供了来自 POP 位置的缓存响应。

    • REC – CloudFront 提供了来自区域边缘缓存 (REC)位置的缓存响应。

    • Origin Shield – CloudFront 提供了来自充当 Origin Shield 的 REC 的缓存响应。

  • cdn-upstream-layer – 当 CloudFront 从源请求完整对象时,此指标存在并包含以下值之一:

    • EDGE – POP 位置已将请求直接发送到源。

    • REC – REC 位置已将请求直接发送到源。

    • Origin Shield – 充当 Origin Shield 的 REC 已将请求直接发送到源。

  • cdn-upstream-dns – 包含一个值,其中包含检索源的 DNS 记录所花费的毫秒数。值为零 (0) 表示 CloudFront 使用了缓存的 DNS 结果或重用了现有连接。

  • cdn-upstream-connect – 包含一个值,其中包含原始 DNS 请求完成与到源的 TCP(和 TLS,如果适用)连接完成之间的毫秒数。值为零 (0) 表示 CloudFront 重用了现有连接。

  • cdn-upstream-fbl – 包含一个值,其中包含从源 HTTP 请求完成到从来自源的响应中收到第一个字节之间的毫秒数(第一个字节延迟)。

  • cdn-downstream-fbl – 包含一个值,其毫秒数介于边缘位置完成接收请求的时间与它将响应的首个字节发送至查看者的时间之间。

Sever-Timing 标头示例

以下是启用 Server-Timing 标头设置时,查看器可能从 CloudFront 接收的 Server-Timing 标头的示例。

例 – 缓存未命中

以下示例显示当请求的对象不在 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)。

例 – 缓存命中

以下示例显示当请求的对象在 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)。