Media CDN 提供先進的 HTTP 轉送功能,可讓您以精細的層級將流量對應至特定的邊緣設定與來源。
設定轉送規則
設定 Media CDN 服務的路由規則。
控制台
前往 Google Cloud 控制台的「Media CDN」頁面。
如要開啟服務的「詳細資料」頁面,並為該服務設定路徑規則,請按一下服務名稱。
如要切換至編輯模式,請按一下「編輯」按鈕。
如要前往「Routing」(路由) 部分,請按一下「Next」(下一步)。
至少須指定一項主機規則。按一下「新增主機規則」。接著,請按照下列步驟操作:
在「說明」中,提供主機規則的簡短說明。
如要編輯主機規則,請按一下箭頭展開規則。
請至少指定一項轉送規則。按一下「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 標頭和來源對應。路線可以共用起點。
舉例來說,您可以將資訊清單的要求轉送至特定來源,並定義短期快取存留時間和負向快取政策。如要將區隔要求分割到其他來源,可以使用標頭和查詢參數,區分特定資訊清單類型或使用者。
以下範例說明如何為主機 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結尾的影片片段,並對這些回應套用較長的 TTL (1 天)。
使用 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 傳送,
hostRules[].hosts[]的*.vod.example.com項目會與us.vod.example.com和us.vod.example.com:80相符。 - 如果要求是透過 HTTPS (TLS) 傳送,
hostRules[].hosts[]項目會與*.vod.example.com相符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。
較明確的路徑應設為較高的優先順序 (較小的數字)。如果路徑符合 /stream/ 的前置字串,且優先順序為 1,則優先順序為 5 的 /stream/live/eu/ 較明確路徑將無法比對任何要求。
- 優先順序最高的路徑為「1」,最低為「999」。
- 您無法設定兩個以上優先順序相同的 routeRule。每條規則的優先順序必須設為介於 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 只會透過 Proxy 將 GET、HEAD 和 OPTIONS 方法傳送至來源,並篩除可修改來源的方法。
如要覆寫特定路徑規則的預設行為,請指定要 Proxy 至來源的方法。除了 GET、HEAD 和 OPTIONS 之外,Media CDN 還支援 PUT、POST、DELETE 和 PATCH。
Media CDN 只會針對使用較安全 HTTP 方法 (例如 GET、HEAD 或 OPTIONS) 的要求重試或嘗試容錯移轉。
如要為路由規則設定一組方法的支援,請指定 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 節進行正規化。舉例來說,根據 RFC 3986 中定義的「移除點區段」演算法,路徑
/a/b/c/./../../g會正規化為/a/g。系統會在檢查快取或將要求轉送至來源之前,執行這項正規化作業。 - 要求不會經過百分比編碼正規化。舉例來說,如果網址含有百分比編碼的正斜線字元 (
%2F),系統不會將其解碼為未編碼的形式。
網址仍會區分大小寫,且「不會」經過大小寫正規化。許多網址都含有區分大小寫的 base64 編碼,包括含有已簽署要求符記的網址。
重寫及重新導向
以下各節提供如何改寫要求和設定重新導向的範例。
重新編寫要求網址
Media CDN 支援主機和路徑重寫。重寫會變更傳送至來源的網址,並視需要修改主機和路徑。主機和路徑重寫作業位於路徑層級,可讓您根據任何比對器 (包括路徑、查詢參數和要求標頭),定義要重寫哪些特定要求。
詳情請參閱 RouteAction.UrlRewrite 的 API 規格。
以下是改寫要求的 3 種方式:
| 欄位 | 說明 |
|---|---|
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 儲存空間 bucket、Azure Blob Storage 和其他儲存空間供應商。如果您採用多雲架構,或尚未使用 Storage 移轉服務將資料遷移至 Cloud Storage,這項功能就非常實用。
最低來源設定,用於在 AWS S3 中設定虛擬代管值區:
name: MY_S3_ORIGIN originAddress: BUCKET-NAME.s3.REGION.amazonaws.com
如果使用的值區名稱與為 EdgeCacheService 資源設定的主機名稱不符,您也必須為與這個來源 (或來源) 相關聯的路徑設定主機重寫。否則,從來源擷取時,系統會使用用戶端要求設定的 Host 標頭。
舉例來說,如要將路徑前置字串為 /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
您可以在路徑上為 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"]
corsPolicy 會在 EdgeCacheService 內的 routing.pathMatchers[].routeRules[].routeAction.corsPolicy 中設定。每個 routeRule 都可以視需要定義不同的 corsPolicy,或完全不定義。
如果您定義 corsPolicy 值,並使用同名路徑的 responseHeadersToAdd 欄位設定自訂回應標頭,則自訂回應標頭會優先於 corsPolicy 值,並取代後者。
如果原始回應設定了 HTTP 標頭,且您已設定 corsPolicy 值,系統就會改用 corsPolicy 值。為避免將無效的標頭值傳送至用戶端,或無意間設定比預期更寬鬆的政策,系統不會摺疊或合併這些值。
特殊 {origin_request_header} 會填入用戶端要求中的 Origin HTTP 標頭。您可以在路徑上將此值設為自訂回應標頭值,用於 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 |
不適用 |
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要求。如要設定其他方法的支援功能,請參閱路徑方法。如果特定路徑未啟用某些方法,系統會以 HTTP405 (Method Not Allowed)錯誤拒絕這些方法。 - 系統會拒絕含有主體的 HTTP
GET要求,或任何含有尾部的要求,並傳回 HTTP400錯誤,因為GET要求不允許有要求主體。 - 查詢參數和標頭比對是邏輯「AND」運算子,要求必須比對所有查詢參數或標頭鍵 (和值,如果指定的話),才能比對給定的路徑。
後續步驟
- 請參閱設定快取說明文件。
- 瞭解如何連線至不同來源。
- 為服務設定 TLS (SSL) 憑證。
- 設定已簽署的要求,驗證內容存取權。
- 如要進一步瞭解如何使用 Terraform 設定
EdgeCacheService資源,請參閱 Terraform 登錄檔說明文件。