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 程式碼片段顯示含有自訂標頭的路徑規則。
這個範例會執行以下操作:
- 使用
{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 地區代碼,例如 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 |
指派給原本產生此回應要求的專屬 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 版本。可能的值包括 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
) 則永遠不會合併。新增部分標頭,或在標頭中附加值。Media 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
,則所有快取元件都會將要求的內容視為無法快取,並從來源擷取所有這類內容的要求。為確保內容能妥善快取,請詳閱 Media CDN 的來源需求。
- 如果標頭也包含
預設標頭
Media CDN 會分別在原始要求和用戶端回應中加入下列要求和回應標頭。
標頭 | 說明 | 要求 | 回應 |
---|---|---|---|
x-request-id |
指定要求的專屬 ID。這個值也會以 jsonPayload.requestId 的形式新增至要求記錄,讓您將用戶端要求/回應與記錄項目建立關聯。 |
✔ | |
age |
傳回快取物件的年齡 (在快取中存在的秒數)。時間長度通常會根據物件最初在長尾 (防護) 快取位置快取的時間來計算。 沒有 |
✔ | |
via |
將 Google 視為中介 Proxy。 這項屬性會設為 |
✔ | ✔ |
server |
設為 Google-Edge-Cache 。 |
✔ | |
cdn-loop |
找出迴圈,例如原始主機與面向使用者的邊緣主機相同。 系統會根據 RFC 8586 將 |
✔ | |
forwarded |
當路徑中含有 Proxy (或多個 Proxy) 時,您可以透過這些標頭識別連線用戶端的 IP 位址。舉例來說,如果 IP 位址為
如果有多個用戶端 Proxy,則連線至 Media CDN 的用戶端會是標頭值中附加的最後一個位址。 |
✔ | |
x-forwarded-for |
非結構化且實際上是標準版本的 這兩個標頭會在要求中傳送,以支援可能不瞭解 |
✔ |
請注意,標頭鍵不區分大小寫,因此請求和回應標頭的標頭鍵都會轉為小寫。
您可以使用動態標頭變數新增其他標頭,包括邊緣 PoP 位置和快取狀態 (例如 hit
和 miss
)。