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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

了解响应标头策略

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

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

策略详细信息(元数据)

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

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

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

CORS 标头

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

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

Access-Control-Allow-Credentials

这是一个布尔设置(truefalse),用于确定是否在响应 CORS 请求时 CloudFront 添加Access-Control-Allow-Credentials标头。当此设置设置为时true, CloudFront 会在 CORS 请求的响应中添加Access-Control-Allow-Credentials: true标头。否则, CloudFront 不会将此标头添加到响应中。

Access-Control-Allow-Headers

指定在响应 CORS 预检请求时 CloudFront 用作Access-Control-Allow-Headers标头值的标头名称。此设置的有效值包括 HTTP 标头名称或通配符(*)(这表示允许所有标头)。请注意,Authorization 标头不能使用通配符,必须始终明确列出。

下表显示了通配符的有效使用示例:

示例 将匹配 将不匹配

x-amz-*

x-amz-test

x-amz-

x-amz

x-*-amz

x-test-amz

x--amz

* Authorization 外的所有标头 Authorization
Access-Control-Allow-Methods

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

Access-Control-Allow-Origin

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

注意

允许将通配符(*)用作域(*.example.org)的最左侧部分。

允许在以下位置使用通配符 (*):

  • 顶级域(example.*

  • 子域(test.*.example.org)的右侧

  • 术语含义(exa*mple.org)

下表显示了通配符的有效使用示例:

示例 将匹配 将不匹配

http://*.example.org

http://www.example.com

http://test.example.org

http://test.example.org:123

https://test.example.org

https://test.example.org:123

*.example.org

test.example.org

test.test.example.org

.example.org

http://test.example.org

https://test.example.org

http://test.example.org:123

https://test.example.org:123

example.org

http://example.org

https://example.org

http://example.org

https://example.org

http://example.org:123

http://example.org:*

http://example.org:123

http://example.org

http://example.org:1*3

http://example.org:123

http://example.org:1893

http://example.org:13

*.example.org:1*

test.example.org:123

Access-Control-Expose-Headers

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

Access-Control-Max-Age

秒数, CloudFront 用作响应 CORS 预检请求时Access-Control-Max-Age标头的值。

源覆盖

这是一个 Boolean 设置(truefalse),用于确定当 CloudFront 来自来源的响应包含策略中也包含的 CORS 标头之一时的行为方式。

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

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

当源响应不包含策略中的 CORS 标头时, CloudFront 会将策略中的 CORS 标头添加到发送给查看者的响应中。 CloudFront 此设置设置为true或时会执行此操作false

安全标头

可以使用安全标头设置在响应标头策略中添加和配置多个与安全相关的 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令的值

  • 的布尔设置(truefalsepreload,用于确定此标头的值中是否 CloudFront 包含该preload指令

  • 的布尔设置(truefalseincludeSubDomains,用于确定此标头的值中是否 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 筛选)

  • 的布尔设置(truefalseblock,用于确定是否将指mode=block令 CloudFront 包含在此标头的值中

  • 报告 URI,用于确定此标头的值中是否 CloudFront 包含该report=reporting URI指令

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

源覆盖

这些安全标头设置中的每一个都包含一个布尔设置(truefalse),该设置决定了当 CloudFront 来自来源的响应包含该标头时的行为方式。

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

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

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

自定义标头

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

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

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

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

  • 当源响应不包含策略中的自定义标头时, CloudFront 会将策略中的自定义标头添加到发送给查看者的响应中。 CloudFront 此设置设置为true或时会执行此操作false

删除标头

您可以指定 CloudFront 要从源端收到的响应中删除的标题,这样 CloudFront 发送给查看者的响应中就不会包含标题。 CloudFront 从它发送给查看者的每个响应中移除标题,无论对象 CloudFront是从缓存中还是从源端提供。例如,您可以删除对浏览器无用的标题(例如X-Powered-By或)Vary,以便将这些标头从发送给查看者的响应中 CloudFront 删除。

使用响应标头策略指定要删除的标头时,请先 CloudFront 删除标头,然后添加在响应标头策略的其他部分中指定的任何标头(CORS 标头、安全标头、自定义标头等)。如果您指定要删除的标头,但在策略的另一部分中添加了相同的标题,则会在发送给查看者的响应中 CloudFront 包含该标题。

注意

您可以使用响应标头策略来移除从源 CloudFront 收到的ServerDate标头,这样 CloudFront 发送给查看者的响应中就不会包含这些标头(从源收到的)。但是,如果您这样做,则 CloudFront 会将其自己的标题版本添加到发送给查看者的响应中。对于 CloudFront添加的Server标头,标头的值为CloudFront

您无法删除的标头

您无法使用响应标头策略删除以下标头。如果您在响应标头策略(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 标头

使用标Server-Timing头设置在发自的 HTTP 响应中启用Server-Timing标头 CloudFront。您可以使用此标题查看指标,这些指标可以帮助您深入了解您的来源的行为 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),如果请求包含Server-Timing标头,也会将Pragma: server-timing标头 CloudFront 添加到响应中。

源中的 Server-Timing 标头

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

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

Server-Timing 标头指标

Server-Timing标头 CloudFront 添加到 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 提供来自缓存的响应而不向源发出请求时,就会出现此指标。它包含下列值之一:

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

包含一个值,表示边缘站点完成接收请求的时间与它将响应的首个字节发送至查看器的时间之间的毫秒数。

Server-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)。

  • 花了 114 毫秒才完成与源站的 CloudFront TCP(以及 TLS,如果适用)连接()。cdn-upstream-connect;dur=114

  • 完成请求 () 后,花了 177 毫秒才从源端收到响应的第一个字节。 CloudFront 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==")。

  • 在收到查看者请求后,花了 436 毫秒才将响应的第一个字节发送给查看者()。 CloudFront 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")。

  • 在收到查看者请求后,花了 137 毫秒才将响应的第一个字节发送给查看者()。 CloudFront cdn-downstream-fbl;dur=137