借助媒体 CDN,您可以指定自定义请求和响应标头。
借助自定义标头,您可以执行以下操作:
- 返回有关客户端的地理数据,例如国家/地区、区域或城市,您可以使用这些数据来显示本地化内容。
- 确定响应是否来自缓存(全部或部分),以及来自哪个缓存位置。
- 移除、替换或附加到请求标头和响应标头。
您还可以使用标头将请求路由到不同的来源。如果您需要配置跨源资源共享 (CORS) 标头,请为每个路由配置 CORS 政策。
设置自定义标头
标头是在每个路由上设置的,这样您就可以为不同的内容(例如清单或视频片段)添加和移除标头。
在 CDN 处理路径中尽早设置每个路由的自定义请求标头,在做出缓存决策之前进行设置。例如,如果您将 cache-control
标头设置为按路由自定义的标头,则会影响 CDN 中的缓存行为。
默认情况下,添加的标头值以英文逗号分隔,并附加到具有相同字段名称的响应或请求标头。
如需覆盖现有值,请将 replace
设置为 true
。
gcloud 和 YAML
如需列出 EdgeCacheService
资源的 YAML 配置,请使用以下命令:
gcloud edge-cache services describe prod-media-service
.routing.pathMatchers[].routeRules[].headerAction
部分显示了要添加和移除的标头:
routeRules:
- priority: 1
description: "video routes"
matchRules:
- prefixMatch: "/video/"
headerAction:
responseHeadersToAdd:
# Return the country (or region) associated with the client's IP address.
- headerName: "client-geo"
headerValue: "{client_region}"
replace: true
requestHeadersToAdd:
# Inform the upstream origin server the request is from Media CDN
- headerName: "x-downstream-cdn"
headerValue: "Media CDN"
responseHeadersToRemove:
- headerName: "X-User-ID"
- headerName: "X-Other-Internal-Header"
Terraform
以下 Terraform 代码段显示了带有自定义标头的路由规则。
此示例会执行以下操作:
- 使用
{client_region}
变量向响应添加自定义client-geo
标头,该变量会返回与客户端 IP 地址相关联的国家/地区(或区域)。 - 使用静态字符串向请求添加自定义
x-downstream-cdn
标头。 - 移除了两个内部标头。
如需配置特定于来源的自定义标头,请参阅配置特定于来源的主机重写或标头修改。
动态标头变量
自定义标头可以包含一个或多个动态变量。
属于缓存键政策 (cacheKeyPolicy.includedHeaderNames
) 的请求标头可以包含一个或多个自定义变量。包含其他动态变量的请求标头不能作为缓存键的一部分。
变量 | 说明 | 支持请求标头 | 支持在缓存键中使用请求标头 | 支持响应标头 |
---|---|---|---|---|
cdn_cache_status |
请求/响应路径中每个缓存节点的位置(最近机场的 IATA 代码)和状态的英文逗号分隔列表,其中最右侧的值表示距离用户最近的缓存。 | ? | ||
client_city |
发起请求的城市名称,例如表示加利福尼亚州山景城的 Mountain View 。此变量没有标准的有效值列表。城市名称可以包含 US-ASCII 字母、数字、空格和以下字符:!#$%&'*+-.^_`|~ 。 |
? | ? | |
client_city_lat_long |
发起请求的城市的纬度和经度,例如 37.386051,-122.083851 (表示请求来自山景城)。 |
? | ? | |
client_region |
与客户端 IP 地址相关联的国家/地区(或区域)。这是一个 Unicode CLDR 区域代码,例如 US 或 FR 。
对于大多数国家/地区,这些代码直接对应于 ISO-3166-2 代码。 |
? | ? | ? |
client_region_subdivision |
与客户端 IP 地址相关联的国家/地区的下属行政单位,例如省或州。这是一个 Unicode CLDR 下属行政单位 ID,例如 USCA 或 CAON 。这些 Unicode 代码从 ISO-3166-2 标准定义的下属行政单位派生而来。 |
? | ? | ? |
client_rtt_msec |
CDN 与 HTTP(S) 客户端之间的预计往返传输时间,以毫秒为单位。这是 CDN 的 TCP 堆栈根据 RFC 2988 测量的平滑往返时间 (SRTT) 参数。 | ? | ? | |
device_request_type |
客户使用的设备类型。有效值为:DESKTOP 、MOBILE 、TABLET 、SMART_TV 、GAME_CONSOLE 、WEARABLE 和 UNDETERMINED 。 |
? | ? | |
original_request_id |
最初生成此响应的请求的唯一标识符。仅当此值与缓存响应的 request_id 不同时填充。 |
? | ||
origin_name |
响应的代理来源 EdgeCacheOrigin 资源。 |
? | ||
origin_request_header |
反映的是请求中跨域资源共享 (CORS) 用例的 Origin 标头的值。 | ? | ||
proxy_status |
响应路径中的中间 HTTP 代理列表。该值由 RFC 9209 定义。
EdgeCacheService 资源由 Google-Edge-Cache 表示。如果响应是从源提取的,则 EdgeCacheOrigin 资源由 Google-Edge-Cache-Origin 表示。 |
? | ||
tls_sni_hostname |
由客户端在 TLS 或 QUIC 握手期间提供的服务器名称指示(如 RFC 6066 中所定义)。系统会将主机名转换为小写字母并移除结尾的任何英文句点。 | ? | ? | |
tls_version |
客户端与负载均衡器在 SSL 握手期间协商的 TLS 版本。可能的值包括 TLSv1 、TLSv1.1 、TLSv1.2 和 TLSv1.3 。如果客户端使用 QUIC(而不是 TLS)进行连接,则值将为 QUIC。 |
? | ? | |
tls_cipher_suite |
在 TLS 握手期间协商的加密套件。该值由 IANA TLS 加密套件注册系统定义,例如 TLS_RSA_WITH_AES_128_GCM_SHA256 。对于 QUIC 和未加密的客户端连接,此值为空。 |
? | ? | |
user_agent_family |
客户端使用的浏览器系列。有效值包括:APPLE 、APPLEWEBKIT 、BLACKBERRY 、DOCOMO 、GECKO 、GOOGLE 、KHTML 、KOREAN 、MICROSOFT 、MSIE 、NOKIA 、NETFRONT 、OBIGO 、OPENWAVE 、OPERA 、OTHER 、POLARIS 、TELECA 、SEMC 、SMIT 和 USER_DEFINED 。 |
? | ? |
以下注意事项适用于自定义变量:
系统会保留现有的请求和响应标头,但会移除以下标头:
X-User-IP
- 包含
X-Google
或X-GFE
的任何标头
标头键和值必须符合 RFC 7230,不允许使用已过时的格式。
所有标头键都会转换为小写(根据 HTTP/2)。
某些标头会合并。如果同一标头键(例如
Via
)具有多个实例,则负载均衡器会将它们的值组合成单个标头键的单一英文逗号分隔列表。只有其值可以用英文逗号分隔列表来表示的标头会合并。Set-Cookie
之类的其他标头永远不会合并。系统会添加一些标头,或者为一些标头附加值。 媒体 CDN 始终会添加或修改某些标头,例如
Via
和X-Forwarded-For
。Media CDN 会展开包含受支持变量的任何响应标头,即使该标头是由客户端或源站设置的也是如此。这样一来,除了配置自定义标头之外,您还可以从客户端(例如视频播放器)或源基础架构设置动态标头。Media CDN 不会展开请求路径上的变量。
例如,根据前面所述的规则,
X-Goog-
和X-Amz-
标头会被保留并转换为小写。
缓存状态值
{cdn_cache_status}
标头变量可以返回与提供响应的缓存层级对应的多个值。在解读 {cdn_cache_status}
标头变量时,请考虑以下准则:
- 如果标头包含
hit
,则表示所请求的内容是从缓存中检索的。 - 如果标头包含
miss
,则表示在缓存节点中未找到所请求的内容,必须从上游节点检索。 - 如果标头包含
fetch
,则表示所请求的内容是从来源检索的。 如果标头包含
uncacheable
,则缓存基础架构的某些或所有组件认为所请求的内容不可缓存。- 如果标头还包含
hit
或miss
,则表示某些缓存组件认为所请求的内容不可缓存,而其他缓存组件认为可缓存。 - 如果该标头不包含
hit
或miss
,则所有缓存组件都认为所请求的内容不可缓存,并且对该内容的所有请求都从源中提取。为确保您的内容得到适当缓存,请查看媒体 CDN 源站要求。
- 如果标头还包含
默认标头
Media CDN 会分别向源请求和客户端响应添加以下请求标头和响应标头。
标题 | 说明 | 请求 | 响应 |
---|---|---|---|
x-request-id |
相应请求的唯一标识符。此值还会作为 jsonPayload.requestId 添加到请求日志中,以便您将客户端请求/响应与日志条目相关联。 |
? | |
age |
返回缓存对象的存在时间(以秒为单位)。年龄通常根据对象最初在长尾(盾)缓存位置缓存的时间计算得出。 没有 |
? | |
via |
将 Google 标识为中间代理。 此设置已设为 |
? | ? |
server |
设置为 Google-Edge-Cache 。 |
? | |
cdn-loop |
识别环路 - 例如,源主机与面向用户的(边缘)主机相同。 根据 RFC 8586,将 |
? | |
forwarded |
借助这些标头,您可以在路径中存在代理时识别连接客户端的 IP 地址。例如,如果 IP 地址为
如果存在多个客户端代理,则连接到 Media CDN 的客户端是标头值中附加的最后一个地址。 |
? | |
x-forwarded-for |
这两个标头都会在请求中发送,以支持可能不知道 |
? |
由于标头键不区分大小写,因此请求和响应标头的标头键都会转换为小写。
您可以使用动态标头变量添加其他标头,包括边缘 PoP 位置和缓存状态(例如 hit
和 miss
)。