定义自定义标头

借助媒体 CDN,您可以指定自定义请求和响应标头。

借助自定义标头,您可以执行以下操作:

  • 返回有关客户端的地理数据(例如国家/地区、区域或城市),您可以使用这些数据来显示本地化内容。
  • 确定响应是否从缓存传送(全部或部分),以及从哪个缓存位置传送。
  • 移除、替换或附加到请求和响应标头。

设置自定义标头

标头是在每个路由上设置的,这样您就可以为不同的内容(例如清单或视频片段)添加和移除标头。

在 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 代码段显示了包含自定义标头的路由规则。

route_rule {
  description = "video routes"
  priority    = 1
  match_rule {
    prefix_match = "/video/"
  }
  origin = google_network_services_edge_cache_origin.default.name
  header_action {
    response_header_to_add {
      # Return the country (or region) associated with the client's IP address.
      header_name  = "client-geo"
      header_value = "{client_region}"
      replace      = true
    }
    request_header_to_add {
      # Inform the upstream origin server that the request is from Media CDN.
      header_name  = "x-downstream-cdn"
      header_value = "Media CDN"
    }
    response_header_to_remove {
      header_name = "X-User-ID"
    }
    response_header_to_remove {
      header_name = "X-Other-Internal-Header"
    }
  }
}

此示例会执行以下操作:

  • 使用 {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 区域代码,例如 USFR。对于大多数国家/地区,这些代码直接对应于 ISO-3166-1 alpha-2 代码
client_region_subdivision 与客户端 IP 地址相关联的国家/地区的下属行政单位,例如省或州 。这是 Unicode CLDR 下属行政单位 ID,例如 USCACAON这些 Unicode 代码 从 ISO-3166-2 标准定义的下属行政单位派生而来。
client_rtt_msec CDN 与 HTTP(S) 客户端之间的预计往返传输时间,以毫秒为单位。这是 CDN 的 TCP 堆栈根据 RFC 2988测量的平滑往返时间 (SRTT) 参数。
device_request_type 客户端使用的设备类型。有效值包括:DESKTOPMOBILETABLETSMART_TVGAME_CONSOLEWEARABLEUNDETERMINED
edge_location_country_code 标识为客户端请求提供服务的 特定媒体 CDN 边缘缓存服务器的地理国家/区域。这是一个 ISO 3166-1 alpha-2 国家/地区代码,例如 USJP这两个字母的代码从 ISO 3166-1 标准定义的官方国家/地区代码派生而来。
host 客户端请求最初发送到的服务器的主机和端口号,对应于 HTTP/1.1 的 Host 请求标头或 HTTP/2 的 :authority 伪标头的值。
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 版本 。可能的值包括 TLSv1TLSv1.1TLSv1.2TLSv1.3。如果客户端使用 QUIC(而不是 TLS)进行连接,则值将为 QUIC。
tls_cipher_suite 在 TLS 握手期间协商的加密套件。该值由 IANA TLS 加密套件注册系统定义,例如 TLS_RSA_WITH_AES_128_GCM_SHA256。对于 QUIC 和未加密的客户端连接,此值为空 。
user_agent_family 客户端使用的浏览器系列。有效值包括:APPLEAPPLEWEBKITBLACKBERRYDOCOMOGECKOGOOGLEKHTMLKOREANMICROSOFTMSIENOKIANETFRONTOBIGOOPENWAVEOPERAOTHERPOLARISTELECASEMCSMITUSER_DEFINED

以下注意事项适用于自定义变量:

  • 系统会保留现有的请求和响应标头,但以下标头除外,这些标头会被移除:

    • X-User-IP
    • 任何带有 X-GoogleX-GFE 的标头
  • 标头键和值必须符合 RFC 7230,不允许使用 已过时的格式。

  • 所有标头键都会转换为小写(根据 HTTP/2)。

  • 某些标头会合并。如果同一标头键(例如 Via)具有多个实例,则负载均衡器会将它们的值组合成单个标头键的单一英文逗号分隔列表。只有其值可以用英文逗号分隔列表来表示的标头会合并。 之类其他标头永远不会合并。Set-Cookie

  • 系统会添加一些标头,或者为一些标头附加值。 媒体 CDN 始终会添加或修改某些标头,例如 X-Forwarded-For

  • 媒体 CDN 会展开任何带有 受支持 变量的响应标头,即使是由客户端或源站设置的也是如此。这样,除了配置自定义标头之外,您还可以从客户端(例如视频播放器)或源站基础架构设置动态标头。

  • 例如,根据前面介绍的规则,X-Goog-X-Amz- 标头会被保留并转换为小写。

缓存状态值

{cdn_cache_status} 标头变量可以返回与传送响应的缓存层级对应的多个值。请考虑以下准则来解读 {cdn_cache_status} 标头变量:

  • 如果标头包含 hit,则表示所请求的内容是从缓存中检索的。
  • 如果标头包含 miss,则表示在缓存节点中未找到所请求的内容,必须从上游节点检索。
  • 如果标头包含 chunked,则表示在缓存节点中未找到所请求的内容,必须从上游节点检索,并且上游响应不包含 Content-Length 标头。
  • 如果标头包含 fetch,则表示所请求的内容是从源站检索的。
  • 如果标头包含 bypassed,则表示缓存被请求配置绕过。
  • 如果标头包含 uncacheable,则表示缓存基础架构的某些或所有组件都认为所请求的内容不可缓存。

    • 如果标头还包含 hitmiss,则表示某些缓存组件认为所请求的内容不可缓存,而其他组件认为可缓存。
    • 如果标头不包含 hitmiss,则表示所有缓存组件都认为所请求的内容不可缓存,并且对该内容的所有请求都是从源站提取的。为确保您的内容得到适当缓存,请查看 媒体 CDN 源站 要求

默认标头

媒体 CDN 会分别将以下请求和响应标头添加到源站请求和客户端响应中。

标题 说明 请求 响应
x-request-id 给定请求的唯一标识符。此值还会作为 jsonPayload.requestId 添加到请求日志中,以便将客户端请求/响应与日志条目相关联。
age

返回缓存对象的存在时间(在缓存中的秒数)。存在时间通常根据对象最初在长尾(屏蔽)缓存位置缓存的时间计算得出。

没有 age 标头的响应不会从 缓存传送。

server 设置为 Google-Edge-Cache
cdn-loop

标识 循环,例如源站主机与面向用户的(边缘)主机相同的情况。

根据 RFC 8586,系统会将 google 令牌附加到标头。该令牌无法更改。

forwarded

x-forwarded-for 标头的结构化版本。 forwarded 标头在 RFC 7239 中定义。

当路径中存在一个或多个代理时,您可以使用这些标头来标识连接 客户端的 IP 地址。例如,如果 IP 地址为 192.0.2.60 的客户端通过 HTTPS 连接到 媒体 CDN,则 forwarded 标头会按如下方式填充:

forwarded: [for=192.0.2.60;proto=https]

如果存在多个客户端代理,则连接到 媒体 CDN 的客户端是标头 值中附加的最后一个地址。

x-forwarded-for

` 0{/}` 标头的非结构化和事实标准版本。forwarded值通常以逗号分隔。

这两个标头都会在请求中发送,以支持可能不知道 forwarded 标头的旧版源站。

对于请求和响应标头,标头键都会转换为小写,因为标头键不区分大小写。

您可以使用 动态标头变量添加其他标头,包括边缘入网点 (PoP) 位置和缓存 状态(例如 hitmiss)。