定義自訂標頭

Media 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 程式碼片段顯示含有自訂標頭的路徑規則。

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 發出要求的城市經緯度,例如,如果是來自 Mountain View (山景市) 的要求,則這個字串會是 37.386051,-122.083851
client_region 與用戶端 IP 位址關聯的國家 (或地區)。這是 Unicode CLDR 地區代碼,例如 USFR。對於大多數國家/地區,這些代碼可以直接對應至 ISO-3166-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
original_request_id 指派給原本產生此回應要求的專屬 ID。只有在快取回應的 request_id 與此不同時,才會填入。
origin_name 回應的 Proxy 來源 EdgeCacheOrigin 資源。
origin_request_header 反映跨來源資源共享 (CORS) 用途的來源標頭值。
proxy_status 回應路徑中的中介 HTTP Proxy 清單。這個值由 RFC 9209 定義。EdgeCacheService 資源由 Google-Edge-Cache 表示。如果回應是從來源擷取,EdgeCacheOrigin 資源會以 Google-Edge-Cache-Origin 表示。
tls_sni_hostname 伺服器名稱指標 (如 RFC 6066 中的定義),如果用戶端在 TLS 或 QUIC 交握期間提供。系統會將主機名稱轉換為小寫,並移除任何尾隨點。
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) 則永遠不會合併。

  • 新增部分標頭,或在標頭中附加值。Media CDN 一律會新增或修改特定標頭,例如 ViaX-Forwarded-For

  • 即使是用戶端或來源設定的回應標頭,Media CDN 也會使用支援的變數擴充回應標頭。除了設定自訂標頭,您還可以透過這項功能,從用戶端 (例如影片播放器) 或來源基礎架構設定動態標頭。Media CDN 不會展開要求路徑上的變數。

  • 舉例來說,根據前述規則,X-Goog-X-Amz- 標頭會保留並轉為小寫。

快取狀態值

{cdn_cache_status} 標頭變數可傳回多個值,對應提供回應的快取層級。請參考下列指南,瞭解如何解讀 {cdn_cache_status} 標頭變數:

  • 如果標頭包含 hit,表示已從快取中擷取要求的內容。
  • 如果標頭包含 miss,表示快取節點未找到要求的內容,必須從上游節點擷取。
  • 如果標頭包含 fetch,表示已從來源擷取要求的內容。
  • 如果標頭包含 uncacheable,系統會將要求的內容視為無法由快取基礎架構的部分或所有元件快取。

    • 如果標頭也包含 hitmiss,系統會認為要求的內容對某些快取元件而言無法快取,但對其他快取元件而言可快取。
    • 如果標頭不含 hitmiss,則所有快取元件都會將要求的內容視為無法快取,並從來源擷取所有這類內容的要求。為確保內容能妥善快取,請詳閱 Media CDN 的來源需求

預設標頭

Media CDN 會分別在原始要求和用戶端回應中加入下列要求和回應標頭。

標頭 說明 要求 回應
x-request-id 指定要求的專屬 ID。這個值也會以 jsonPayload.requestId 的形式新增至要求記錄,讓您將用戶端要求/回應與記錄項目建立關聯。
age

傳回快取物件的年齡 (在快取中存在的秒數)。時間長度通常會根據物件最初在長尾 (防護) 快取位置快取的時間來計算。

沒有 age 標頭的回應不會從快取提供。

via

將 Google 視為中介 Proxy。

這項屬性會設為 1.1 google,無法變更。

server 設為 Google-Edge-Cache
cdn-loop

找出迴圈,例如原始主機與面向使用者的邊緣主機相同。

系統會根據 RFC 8586 將 google 符記附加至標頭。您無法變更權杖。

forwarded

x-forwarded-for 標頭的結構化版本。forwarded 標頭的定義在 RFC 7239 中。

當路徑中含有 Proxy (或多個 Proxy) 時,您可以透過這些標頭識別連線用戶端的 IP 位址。舉例來說,如果 IP 位址為 192.0.2.60 的用戶端透過 HTTPS 連線至 Media CDN,系統會將 forwarded 標頭填入以下內容:

forwarded: [for=192.0.2.60;proto=https]

如果有多個用戶端 Proxy,則連線至 Media CDN 的用戶端會是標頭值中附加的最後一個位址。

x-forwarded-for

非結構化且實際上是標準版本的 forwarded 標頭。值通常以半形逗號分隔。

這兩個標頭會在要求中傳送,以支援可能不瞭解 forwarded 標頭的舊版來源。

請注意,標頭鍵不區分大小寫,因此請求和回應標頭的標頭鍵都會轉為小寫。

您可以使用動態標頭變數新增其他標頭,包括邊緣 PoP 位置和快取狀態 (例如 hitmiss)。