Media CDN 提供先進的 HTTP 轉送功能,可讓您以精細的層級將流量對應至特定的邊緣設定與來源。
設定轉送規則
為 Media CDN 服務設定路由規則。
控制台
前往 Google Cloud 控制台的「Media CDN」頁面。
如要為要設定路由規則的服務開啟「詳細資料」頁面,請按一下服務名稱。
如要切換至編輯模式,請按一下「編輯」按鈕。
如要前往「路由」部分,請按一下「下一步」。
至少須指定一個主機規則。按一下「新增主機規則」。接著,請按照下列步驟操作:
針對「主機」,請至少指定一個比對主機。
在「說明」中,提供主辦人規則的簡短說明。
或者,如要編輯主機規則,請按一下箭頭展開規則。
請至少指定一項轉送規則。按一下「Add route rule」(新增轉送規則)。
如要編輯路由規則,請按一下相應資料列中的
「編輯」。在「編輯路徑規則」窗格中,針對「優先順序」,設定路徑優先順序的值。
在「說明」中,提供簡短說明,方便在規則清單中識別規則。
在「比對」部分,至少指定一個比對條件。按一下「新增比對條件」。接著,請按照下列步驟操作:
針對「主要動作」,選取下列其中一個選項:
從來源擷取:如要將要求導向特定來源,請選取這個選項,然後選取來源。
網址重新導向:如要重新導向要求,請選取這個選項。接著,指定重新導向類型、路徑和狀態碼。
您可以視需要選取將所有回應重新導向至 HTTPS,或移除查詢。
按一下 [Advanced configurations] (進階設定)。
在「Header action」部分,按一下「Add an item」。
選取動作類型,然後指定標頭做為名稱和值組合。接著,按一下「完成」。
在「Route action」(轉送動作) 部分,按一下「Add an item」(新增項目)。
指定動作類型及其相關選項。接著,按一下「完成」。
針對「HTTP 方法篩選功能」,選取「自訂 HTTP 方法篩選功能」。
接著,選取要將 Proxy 連至來源的 HTTP 方法。
如要儲存路線規則,請按一下「儲存」。
如要儲存對服務所做的變更,請按一下「更新服務」。
gcloud 和 YAML
將 Media CDN 設定匯出至 YAML 檔案。使用
gcloud edge-cache services export
指令。gcloud edge-cache services export SERVICE_NAME \ --destination=FILENAME.yaml
更改下列內容:
SERVICE_NAME
:服務名稱FILENAME
:YAML 檔案名稱
按照本頁各節所述,更新 YAML 檔案的必要設定。
如要更新服務,請從 YAML 檔案匯入 Media CDN 設定。使用
gcloud edge-cache services import
指令。gcloud edge-cache services import SERVICE_NAME \ --source=FILENAME.yaml
比對請求
Media CDN 設定包含一組路徑,這些路徑是在「轉送」專區中針對 EdgeCacheService
資源定義。這些路由會根據 (至少) 一個主機比對要求。如要進一步瞭解如何將流量導向來源,請參閱 HostRule
和 PathMatcher
。每個路徑都能定義自己的 CDN 設定、重寫、重新導向、CORS 政策、自訂 HTTP 標頭和來源對應。路線可以共用來源。
舉例來說,您可以將資訊清單要求轉送至特定來源,並定義短效快取 TTL 和負向快取政策。您可以使用標頭和查詢參數,將區隔要求分割至其他來源,以便區分特定資訊清單類型或使用者。
以下範例說明如何為主機 media.example.com
轉送符合特定標頭、查詢參數和路徑前置字串的要求:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 10 origin: staging-live-origin matchRules: - prefixMatch: /vod/ headerMatches: - headerName: "x-staging-client" presentMatch: true queryParameterMatches: - name: "live" exactMatch: "yes" routeAction: cdnPolicy: defaultTtl: 5s
路徑比對
Media CDN 支援完整 (完全相符)、前置字元和萬用字元路徑比對。路徑比對可搭配主機、標頭和查詢參數比對,建立精細的轉送要求規則。
以下是比對網址路徑的三種方式。
欄位 | 說明 | 範例 |
---|---|---|
matchRules[].fullPathMatch
|
fullPathMatch 條件會比對完整網址路徑,但不包含查詢字串。您必須指定尾部斜線 (如有必要)。 |
路徑的比對規則為
|
matchRules[].prefixMatch
|
prefixMatch 條件會比對網址路徑前置字元,也就是以相同字串開頭的網址。 |
比對規則為 |
matchRules[].pathTemplateMatch
|
pathTemplateMatch 限制條件支援萬用字元運算子,可讓您比對複雜的網址模式和路徑區段,以及擷取用於重寫網址的命名變數。 |
比對規則為
如需更多範例,請參閱「模式比對」一節。 |
詳情請參閱 MatchRule
的 API 規格。
舉例來說,如要比對以 /stream/
開頭的所有要求,請建立類似下列的路由規則:
name: prod-service routing: hostRules: - hosts: - media.example.com - *.vod.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 matchRules: - prefixMatch: /stream/
以下範例會在比對規則中明確加入結尾斜線:
- 傳送至
media.example.com/stream/id/1234/hls/manifest.m3u8
的要求會與此路徑相符。 - 對
media.example.com/stream-eu/id/4567/hls/manifest.m3u8
提出的要求與此路徑不符。
在第二種情況下,除非已設定其他路徑或萬用路徑,否則 Media CDN 會傳回 HTTP 404
錯誤。
如要瞭解前置字串如何在路徑中運作,請參閱「路徑優先順序和排序」一節。
模式 (萬用字元) 比對
有了模式比對功能,您就能使用萬用字元語法,比對網址的多個部分,包括不完整的網址和後置字元 (檔案副檔名)。
您也可以在 pathTemplateMatch
欄位中,將一或多個路徑片段與具名變數建立關聯,然後在 pathTemplateRewrite
欄位中重寫網址時參照這些變數。這樣一來,您就能在要求傳送至來源之前,重新排序及移除網址區段。
以下範例說明如何比對兩個不同的網址後置字串:
# EdgeCacheService.routing.pathMatchers[] routeRules: - priority: 1 description: "Match video segments" matchRules: - pathTemplateMatch: "/**.ts" - pathTemplateMatch: "/**.m4s" origin: prod-video-storage
支援的語法包括:
運算子 | 相符 | 範例 |
---|---|---|
*
|
符合單一路徑片段,直到下一個路徑分隔符為止:/
|
/videos/*/*/*.m4s 與 /videos/123414/hls/1080p5000_00001.m4s 相符。 |
**
|
符合零或多個路徑片段。如果有的話,必須是最後一個運算子。 |
/**.mpd 與 /content/123/india/dash/55/manifest.mpd 相符。 |
{name} or {name=*}
|
與路徑區段相符的命名變數。
符合單一路徑片段,直到下一個路徑分隔符:
|
/content/{format}/{lang}/{id}/{file}.vtt 會比對 /content/hls/en-us/12345/en_193913.vtt ,並擷取 format="hls" 、lang="en-us" 、id="12345" 和 file="en_193913" 做為變數。 |
{name=videos/*}
|
命名變數與多個路徑區段相符。系統會將與 videos/* 相符的路徑區段擷取為命名變數。 |
/videos/{language=lang/*}/* 會比對 /videos/lang/en/video.m4s ,並將 lang/en 值填入路徑變數 language 。 |
{name=**}
|
命名變數,可比對零個或多個路徑區段。 如果有的話,必須是最後一個運算子。 |
|
注意:
- 如果您不重寫網址,請使用較簡單的
*
和**
運算子。 - 使用變數擷取路徑區段時,如果變數未擷取網址的任何部分,後續
pathTemplateRewrite
就無法參照該部分。如需範例,請參閱「擷取路徑變數」一節。 - 您無法在後續
pathTemplateRewrite
中參照在同一路徑的pathTemplateMatch
中不存在的變數。 - 變數會區分大小寫,
{FORMAT}
、{forMAT}
和{format}
代表不同的變數和值。 - 您最多可以在一個比對中指定 10 個運算子 (萬用字元或變數)。
pathTemplateMatch
和pathTemplateRewrite
欄位的長度不得超過 255 個半形字元。
範例:比對檔案副檔名
以下範例說明萬用字元運算子的常見用途:比對所有路徑區段,直到後置字串為止。
在這種情況下,請執行下列操作:
- 從資訊清單來源擷取結尾為
.m3u8
和.mpd
的影片資訊清單 (播放清單),並為這些回應套用短 TTL (5 秒),因為這些資訊會定期變更。 - 從片段來源擷取結尾為
.ts
和.m4s
的影片片段,並為這些回應套用較長 (1 天) 的 TTL。
使用 SSAI (伺服器端廣告插入) 或 DAI (動態廣告插播) 服務時,以及每隔幾秒就更新資訊清單的直播影片時,通常會採用這種做法。
以下設定說明如何設定 Media CDN 轉送功能以支援這項功能:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: # the first route only matches video manifests - priority: 1 matchRules: - pathTemplateMatch: "/**.m3u8" # "**" matches all path segments - pathTemplateMatch: "/**.mpd" origin: manifest-origin routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL defaultTtl: 5s # the second route matches video segments, fetches them # from a separate origin server, caching them for a longer # duration (1 day). - priority: 2 matchRules: - pathTemplateMatch: "/**.ts" - pathTemplateMatch: "/**.m4s" origin: segment-origin routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL defaultTtl: 86400s
範例:擷取路徑變數
以下範例說明如何使用具名變數來描述一或多個路徑區段。
這些變數可用於 pathTemplateRewrite
,在要求傳送至來源之前重新編寫路徑,或讓複雜的 pathTemplateMatch
自行描述。
routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 matchRules: # Matches a request of "/us/en/hls/123139139/segments/00001.ts" - pathTemplateMatch: "/{country}/{lang}/{format}/{id}/{file=**}" origin: my-origin routeAction: urlRewrite: # Rewrites to "/123139139/hls/segments/00001.ts" pathTemplateRewrite: "/{id}/{format}/{file}"
具體情況如下:
- 每個
{name}
變數都會擷取單一路徑片段。路徑片段是網址路徑中一對/
(「斜線」) 之間的所有字元。 {name=**}
變數會擷取所有剩餘的路徑區段;在本例中,它會比對segments/00001.ts
和master.m3u8
。- 在同一路徑的
pathTemplateRewrite
中,您可以參照部分在pathTemplateMatch
中擷取的變數。您明確省略{country}
和{lang}
變數,因為這些變數與來源的資料夾結構不符。
在這個範例中,會發生以下情況:
- 傳入的
/us/en/hls/123139139/segment_00001.ts
要求網址會與pathTemplateMatch
相符,並在傳送至來源之前重新編寫為/123139139/hls/segment_00001.ts
。 /us/123139139/master.m3u8
的傳入要求網址「不」與pathTemplateMatch
相符,並收到 HTTP404 (Not Found)
回應。/br/es/dash/c966cbbe6ae3/subtitle_00001.vtt
的傳入要求網址也與pathTemplateMatch
相符,並在傳送至來源之前重新編寫為/c966cbbe6ae3/dash/subtitle_00001.vtt
。
如要進一步瞭解萬用字元比對功能如何與網址重寫功能互動,請參閱「重寫」一節。
主機比對
每項服務都能比對多個主機名稱,每組主機名稱都包含自己的路徑群組 (稱為「路徑比對器」)。在大多數情況下,服務的所有主機名稱都會對應至單一組共用路由,其中包含單一主機清單和單一路徑比對器。
name: prod-service routing: hostRules: - hosts: - media.example.com - *.vod.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: # list of routes for the configured hosts - priority: 999 matchRules: - prefixMatch: / origin: DEFAULT_ORIGIN
不相符的主機會顯示預設 HTTP 404
網頁。如要接受任何主機,您可以將萬用字元 *
做為 hostRules[].hosts[]
項目。
您也可以定義路線群組 (例如依國家/地區或直播/隨選影片分組)。由於每項服務都有單一安全性政策,因此我們通常建議為每個市場 (地理區域) 或工作負載建立一項服務。
注意:
- 包含通訊埠的主機 (或 HTTP/2
:authority
) 標頭會隱含比對已設定的主機。您不需要明確指定連接埠。 - 如果要求是透過 HTTP 傳送,
*.vod.example.com
的hostRules[].hosts[]
項目會與us.vod.example.com
和us.vod.example.com:80
相符。 - 如果要求是透過 HTTPS (TLS) 傳送,
*.vod.example.com
的hostRules[].hosts[]
項目會與us.vod.example.com:443
相符。
詳情請參閱 HostRule
的 API 規格。
比對標頭和查詢參數
您可以設定路徑,以便比對特定標頭和查詢參數名稱,以及標頭值 (前置字串、後置字串或完全比對) 的存在。
查詢參數和標頭比對是邏輯「AND」運算,也就是說,要求必須符合所有查詢參數和標頭鍵 (以及指定的值,如有),才能符合指定路徑。
舉例來說,如果您想將具有特定標頭欄位名稱和標頭值的要求,路由至名為 alternate-origin
的來源,請在 routeRules[].matchRules[].headerMatches[]
中設定比對條件:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: alternate-origin matchRules: - prefixMatch: "/videos/" headerMatches: - headerName: "x-device-name" exactMatch: "roku"
在本範例中,網址開頭有 /videos/
且包含 x-device-name: roku
標頭的要求會符合這個路徑。缺少這個標頭名稱或值不同的要求,不符合這個路徑。
詳情請參閱 HeaderMatch
的 API 規格。
同樣地,如要比對查詢參數,請指定一或多個 queryParameterMatches
,如下所示:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: eu-live-origin-prod matchRules: - prefixMatch: "/videos/" queryParameterMatches: - name: "playback_type" exactMatch: "live" - name: "geo" exactMatch: "eu"
在這個範例中,https://cdn.example.com/videos/1234/abcd/xyz.m3u8?playback_type=live&geo=eu
的用戶端要求與此路徑相符。
詳情請參閱 QueryParameterMatcher
的 API 規格。
定義全部接收 (預設) 路徑
根據預設,如果要求不符合任何已設定的路徑,Media CDN 會傳回 HTTP 404 (Not Found)
錯誤。
如要針對特定 pathMatcher
(路線集合) 設定萬用路線,請執行下列操作:
- 建立優先順序最低 (數字最高) 的
routeRule
,例如 999,這是路徑可能的最低優先順序。 - 設定
matchRule
,前置字元比對/
(比對所有要求路徑)。 - 在路線上設定 (其中一個)
origin
或urlRedirect
。
舉例來說,如要設定全部接收的路徑,將所有不相符的要求導向名為 my-origin
的預設來源,請使用 priority: 999
和 /
的 matchRules[].prefixMatch
建立新路徑,如下所示:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 999 origin: my-origin matchRules: - prefixMatch: /
您可以選擇在來源擷取之前重新編寫網址,或重新導向至預設頁面 (例如到達網頁),而非將要求「原封不動」傳送至來源。
路徑優先順序和排序
routeRules[]
陣列中的每個路徑都必須與 priority
建立關聯。
應將較明確的路徑設為較高的優先順序 (數字越小越優先)。如果路徑與優先順序為 1 的 /stream/
前置字串相符,則會阻止優先順序為 5 的 /stream/live/eu/
更明確的路徑與任何要求相符。
- 優先順序最高的路徑為「1」,最低為「999」。
- 您無法設定兩個以上優先順序相同的 routeRules。每個規則的優先順序必須設為介於 1 和 999 之間的數字 (含首尾)。
- 定義全部接收的路徑,即可將所有不相符的要求傳送至預設來源,或重新導向至到達網頁或端點。
在下列範例中,您可以看到 /live/us/
路徑永遠不會比對成功,因為 /live/
路徑的優先順序較高:
routeRules: - priority: 1 description: "Live routes" matchRules: - prefixMatch: /live/ routeAction: cdnPolicy: defaultTtl: 5s - priority: 2 description: "U.S based live streams" matchRules: # This would never be matched, as the /live/ prefixMatch at priority 1 # would always take precedence. - prefixMatch: /live/us/ routeAction: cdnPolicy: defaultTtl: 5s - priority: 999 description: "Catch-all route" matchRules: - prefixMatch: /
為解決這個問題,您可以將較具體 (較長) 的路徑設為較高優先順序:
routeRules: - priority: 1 description: "U.S based live streams" matchRules: # The more specific (longer) match is at a higher priority, and now # matches requests as expected. - prefixMatch: /live/us/ routeAction: cdnPolicy: defaultTtl: 5s - priority: 2 description: "Live routes" matchRules: - prefixMatch: /live/ routeAction: cdnPolicy: defaultTtl: 5s - priority: 999 description: "Catch-all route" matchRules: - prefixMatch: /
這樣一來,更具體的路徑就能正確比對要求。以 /live/eu/
為前置字元的請求仍會以優先順序 2 轉送至 /live/
路徑。
方法篩選
根據預設,Media CDN 只會將 GET
、HEAD
和 OPTIONS
方法 Proxy 到來源,並篩除可修改來源的方法。
您可以指定要將哪些方法轉送至來源,藉此覆寫特定路徑規則的預設行為。除了 GET
、HEAD
和 OPTIONS
之外,Media CDN 也支援 PUT
、POST
、DELETE
和 PATCH
。
如要為路徑規則的一系列方法設定支援功能,請指定 routeMethods
區段,並為每個方法提供 allowed_methods
值。
routeRules: - priority: 5 description: "Video uploads" routeMethods: allowedMethods: ["PUT", "POST", "OPTIONS"] matchRules: - pathTemplateMatch: "/uploads/**.ts" origin: prod-video-storage - priority: 10 description: "Video serving" routeMethods: allowedMethods: ["GET", "HEAD"] matchRules: - pathTemplateMatch: "/videos/**.ts" origin: prod-video-storage
路徑正規化
路徑規格化說明瞭 Media CDN 如何在特定情況下,將網址的多個表示法結合為單一標準表示法。
路徑正規化可減少代表相同內容的網址要求數量,並減輕預期經過正規化路徑的原始來源錯誤,直接改善快取命中率。
傳入的要求會根據以下方式標準化:
- 多個連續斜線會合併為單一斜線。舉例來說,
/videos///12345/manifest.mpd
的網址路徑會正規化為/videos/12345/manifest.mpd
。 - 路徑區段會依據 RFC 3986 第 6.2.2.3 節進行正規化。舉例來說,路徑
/a/b/c/./../../g
會根據 RFC 3986 中定義的「remove dot segments」演算法,轉換為/a/g
。這個規範化程序會在檢查快取或將要求轉送至來源之前執行。 - 系統不會對要求進行百分比編碼正規化處理。舉例來說,如果網址含有以百分比編碼的斜線字元 (
%2F
),系統不會將其解碼為未經編碼的形式。
網址仍會區分大小寫,且「不會」將大小寫轉換為標準格式。許多網址都包含區分大小寫的 Base64 編碼,包括含有已簽署要求符記的網址。
重寫及重新導向
以下各節提供如何改寫要求和設定重新導向的範例。
重新編寫要求網址
Media CDN 支援主機和路徑重寫。重寫會變更傳送至來源的網址,並讓您視需要修改主機和路徑。主機和路徑重寫作業位於路徑層級,可讓您根據任何比對器 (包括路徑、查詢參數和要求標頭) 定義要重寫哪些特定要求。
詳情請參閱 RouteAction.UrlRewrite
的 API 規格。
以下是改寫要求的三種方法:
欄位 | 說明 |
---|---|
urlRewrite.pathPrefixRewrite
|
重新撰寫路徑,移除與要求相符的
單一路徑規則中只能指定 |
urlRewrite.pathTemplateRewrite
|
單一路徑規則中只能指定 |
urlRewrite.hostRewrite
|
在要求傳送至來源伺服器之前,重新編寫主機。 |
注意:
- 重新寫的網址不會變更快取鍵。快取索引鍵會根據用戶端傳送的要求網址。
- 路徑比對和已簽署要求驗證完成後,系統就會進行重寫。路線不會根據其他比對規則重新比對。
範例:移除路徑前置字串
舉例來說,如要將用戶端要求網址從 /vod/videos/hls/1234/abc.ts
重新編寫為 /videos/hls/1234/abc.ts
(從路徑中移除 /vod
),您可以使用 pathPrefixRewrite
功能:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: my-origin matchRules: - prefixMatch: "/vod/videos/" routeAction: urlRewrite: pathPrefixRewrite: "/videos/"
pathPrefixRewrite
的運作方式是將 matchRules[].prefixMatch
中相符的整個路徑前置字元,替換為 pathPrefixRewrite
的值。
如要重新寫主機名稱 (例如將 cdn.example.com
改寫為 my-bucket.s3.us-west-2.amazonaws.com
),您可以設定下列項目:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: my-origin matchRules: - prefixMatch: "/videos/" routeAction: urlRewrite: hostRewrite: "my-bucket.s3.us-west-2.amazonaws.com"
在這種情況下,來源要求網址會從 cdn.example.com/videos/*
變更為 my-bucket.s3.us-west-2.amazonaws.com/videos/*
。您也可以在單一路徑中結合主機和路徑重寫。
範例:使用變數重新編寫網址
如要使用 pathTemplateMatch
和 pathTemplateRewrite
重寫部分傳入要求網址,請參閱「擷取變數」一節。
重新導向要求
Media CDN 支援三種重新導向:
- 主機重新導向,只會重新導向主機 (網域),路徑和查詢參數保持不變。
- 路徑重新導向,會完全取代路徑。
- 路徑前置字串重新導向,只會替換相符的前置字串。
預設的重新導向為 HTTP 301 (Moved Permanently)
,但可以設定為依據個別路徑傳回不同的重新導向狀態碼。
以下設定是使用前置字串重新導向的範例,您可以將造訪 https://cdn.example.com/on-demand/*
的使用者重新導向至 https://cdn.example.com/streaming/*
。
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 10 matchRules: - prefixMatch: "/on-demand/" urlRedirect: # The prefix matched in matchRules.prefixMatch is replaced # by this value prefixRedirect: "/streaming/" redirectResponseCode: TEMPORARY_REDIRECT # corresponds to a HTTP 307
此範例也會將重新導向變更為暫時性重新導向,以免客戶端 (例如瀏覽器) 將其快取。如果您預計在近期內變更這個值,這項功能就很實用。
支援的 redirectResponseCode
值如以下表所示。
重新導向回應代碼 | HTTP 狀態碼 |
---|---|
MOVED_PERMANENTLY_DEFAULT |
HTTP 301 (已永久移動) |
FOUND |
HTTP 302 (已找到) |
SEE_OTHER |
HTTP 303 (查看其他) |
TEMPORARY_REDIRECT |
HTTP 307 (暫時重新導向) |
PERMANENT_REDIRECT |
HTTP 308 (永久重新導向) |
注意:
- 路由可以將流量導向來源,或將重新導向傳回至用戶端。您無法同時設定
origin
和urlRedirect
欄位。 - 將路由重新導向至 HTTPS 的服務,必須附加至少一個 SSL 憑證。
詳情請參閱 RouteRule.UrlRedirect
的 API 規格。
將所有要求重新導向至 HTTPS
如要將所有要求重新導向至 HTTPS (而非 HTTP),您可以將各項服務設為自動將所有用戶端要求重新導向至 HTTPS。透過 HTTP 連線的用戶端會收到 HTTP 301 (Permanent Redirect)
回應,其中 Location
標頭會使用「https://」而非「http://」設定為相同的網址。
gcloud
gcloud edge-cache services update MY_SERVICE \ --require-tls
Request issued for: [MY_SERVICE] Updated service [MY_SERVICE].
這項指令會傳回服務的說明,且 requireTls
目前已設為 true
。
name: MY_SERVICE requireTls: true
您也可以選擇將 Strict-Transport-Security 標頭設為回應標頭,以便指示用戶端一律透過 HTTPS 直接連線。
使用第三方儲存空間後端
Media CDN 可連線至 Google Cloud以外的公開可存取 HTTP 端點,包括 AWS S3 儲存空間值區、Azure Blob 儲存空間和其他儲存空間供應商。如果您採用多雲架構,或尚未使用 Storage 移轉服務將資料遷移至 Cloud Storage,這項功能就非常實用。
在 AWS S3 中設定虛擬代管值區的最低來源設定:
name: MY_S3_ORIGIN originAddress: BUCKET-NAME.s3.REGION.amazonaws.com
如果您使用的值區名稱與為 EdgeCacheService
資源設定的主機名稱不相符,則必須針對與此來源 (或來源) 相關聯的路徑設定主機重寫。否則,從來源擷取時,系統會使用由用戶端要求設定的主機標頭。
舉例來說,如要將路徑前置字串為 /legacy/
的所有要求對應至外部 bucket,您可以同時設定 hostRewrite
和 pathPrefixRewrite
,從來源要求中移除這個前置字串:
routeRules: - description: legacy backend matchRules: - prefixMatch: "/legacy/" routeAction: urlRewrite: hostRewrite: BUCKET-NAME.s3.REGION.amazonaws.com pathPrefixRewrite: / cdnPolicy: cacheMode: CACHE_ALL_STATIC defaultTtl: 3600s
如要進一步瞭解如何在來源要求中設定主機標頭,請參閱「來源要求標頭」說明文件。
跨源資源共享 (CORS)
跨來源資源共享 (CORS) 是一種以瀏覽器為中心的方法,可安全地提出跨來源要求。您可以使用 CORS 政策,根據個別路徑政策自動設定 CORS 標頭,例如 Access-Control-Allow-Origins
。
設定 CORS
您可以使用 Media CDN,在 EdgeCacheService
的路徑上定義 CORS 政策。
CORS 政策會使用一組通用的 HTTP 標頭定義這些規則。您可以在回應中設定常見的 CORS 標頭,例如 Access-Control-Allow-Origin
、Access-Control-Max-Age
和 Access-Control-Allow-Headers
。這些標頭可讓您對 Media CDN 服務進行跨來源呼叫,這些服務可能會在網站前端的不同網域 (來源) 上代管,並可能會防止您未明確允許的跨來源要求。
舉例來說,player.example.com
和 api.example.com
是不同的來源 (在瀏覽器意義上),您可能會希望前端應用程式向 api.example.com
提出要求,以擷取下一首播放清單或重新整理相關內容的清單。同樣地,player.example.com
可能需要與 cdn.example.com
聯絡,以便擷取影片播放清單和影片片段:cdn.example.com
需要指出這項操作沒問題,且 player.example.com
是 allowed origin
,以及任何其他規則 (允許的標頭、是否可納入 Cookie)。
舉另一個例子來說,如果您想在 CORS 要求中允許 stream.example.com
做為來源和 X-Client-ID
標頭,可以在路線上設定 corsPolicy
,如下所示:
corsPolicy: maxAge: 600 allowOrigins: ["stream.example.com"] allowHeaders: ["X-Client-ID"]
在 EdgeCacheService 中的 routing.pathMatchers[].routeRules[].routeAction.corsPolicy
中設定 corsPolicy
。每個 routeRule
都可以視需要定義不同的 corsPolicy
,也可以不定義。
如果您定義 corsPolicy
值,並在同名路徑中使用 responseHeadersToAdd
欄位設定自訂回應標頭,自訂回應標頭會優先採用 corsPolicy
值,並取代該值。
如果原始回應設定了 HTTP 標頭,且您已設定 corsPolicy
值,系統會改用 corsPolicy
值。這些值不會折疊或合併,以免向用戶端傳送無效的標頭值,或不小心設定比預期更寬鬆的政策。
用戶端要求中的 Origin
HTTP 標頭會填入特殊的 {origin_request_header}
。這可設為路徑上 Access-Control-Allow-Origin
標頭的自訂回應標頭值。
詳情請參閱 RouteAction.CORSPolicy
的 API 規格。
CORS 政策欄位
下表說明 CORS 政策包含的欄位。
欄位 | 說明 | 範例 |
---|---|---|
allowOrigins |
設定
舉例來說,如果您的影片內容是從 |
Access-Control-Allow-Origins: https://stream.example.com
|
maxAge |
設定 即使指定了最高值 (86400 秒),某些瀏覽器仍會將此時間限制在 2 小時以下。 |
Access-Control-Max-Age: 7200
|
allowMethods |
設定 根據預設,Media CDN 只支援 |
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
|
allowHeaders |
設定 這項功能通常是影片播放器所需,因為在跨來源要求影片內容時,播放器需要存取影片內容的部分回應標頭。 |
Access-Control-Allow-Headers: Content-Type, If-Modified-Since,
Range, User-Agent
|
exposeHeaders |
設定 這項功能通常是影片播放器所需,因為在跨來源要求內容時,影片播放器可能需要存取影片內容的特定回應標頭。 |
Access-Control-Expose-Headers: Date, Cache-Status, Content-Type,
Content-Length
|
allowCredentials |
設定 如果設為 false,系統就會略過這個標頭。 |
Access-Control-Allow-Credentials: true
|
disabled |
停用 corsPolicy ,但不會移除。預先檢查 OPTIONS 要求會代理至來源。 |
N/A |
範例 corsPolicy
以下設定範例顯示基本 corsPolicy
設定:
routeRules: - priority: 1 matchRules: - prefixMatch: /stream/ routeAction: cdnPolicy: defaultTtl: 3600s corsPolicy: allowOrigins: - "https://stream.example.com" - "https://stream-staging.example.com" maxAge: 86400s # some browsers might only honor up to 7200s or less allowMethods: - "GET" - "HEAD" - "OPTIONS" allowHeaders: - "Content-Type" - "If-Modified-Since" - "Range" - "User-Agent" exposeHeaders: - "Content-Type" - "Content-Length" - "Date"
排解轉送問題
如果某些要求無法擷取相符的結果或傳回錯誤,請檢查下列項目:
- 路徑必須包含
matchRule
,且定義的prefixMatch
、fullPathMatch
或pathTemplateMatch
必須各有一個。如果您未納入其中一個欄位,API 就會傳回錯誤。 - 請確認每個路徑的
priority
設定正確無誤:較具體 (較長) 的路徑應優先於較短、較廣泛的路徑比對。 - 根據預設,系統僅支援
GET
、HEAD
和OPTIONS
要求。如要設定其他方法的支援功能,請參閱「路徑方法」。系統會拒絕未為特定路徑啟用的 HTTP 方法,並傳回 HTTP405 (Method Not Allowed)
錯誤。 - 含有主體的 HTTP
GET
要求,或含有預告片的任何要求,都會因 HTTP400
錯誤而遭到拒絕,因為GET
要求不允許使用要求主體。 - 查詢參數和標頭比對是邏輯「AND」運算子,也就是說,要求必須符合所有查詢參數或標頭鍵 (以及指定的值),才能符合指定路徑。
後續步驟
- 請參閱設定快取的說明文件。
- 瞭解如何連線至不同的來源。
- 為服務設定 TLS (SSL) 憑證。
- 設定已簽署的要求,以驗證內容存取權。
- 如要進一步瞭解如何使用 Terraform 設定
EdgeCacheService
資源,請參閱 Terraform Registry 說明文件。