設定服務路徑

Media CDN 提供先進的 HTTP 轉送功能,可讓您以精細的層級將流量對應至特定的邊緣設定與來源。

設定轉送規則

設定 Media CDN 服務的路由規則。

控制台

  1. 前往 Google Cloud 控制台的「Media CDN」頁面。

    前往 Media CDN

  2. 如要開啟服務的「詳細資料」頁面,並為該服務設定路徑規則,請按一下服務名稱。

  3. 如要切換至編輯模式,請按一下「編輯」按鈕。

  4. 如要前往「Routing」(路由) 部分,請按一下「Next」(下一步)

  5. 至少須指定一項主機規則。按一下「新增主機規則」。接著,請按照下列步驟操作:

    1. 針對「主機」,請至少指定一個「用於比對的主機」。

    2. 在「說明」中,提供主機規則的簡短說明。

    如要編輯主機規則,請按一下箭頭展開規則。

  6. 請至少指定一項轉送規則。按一下「Add route rule」(新增轉送規則)

    如要編輯路徑規則,請按一下相應資料列的「編輯」

  7. 在「編輯路徑規則」窗格中,為「優先順序」設定路徑優先順序值。

  8. 在「說明」中,提供簡短說明,方便您在規則清單中找出規則。

  9. 在「比對」部分,至少指定一個比對條件。按一下「新增比對條件」。然後執行下列操作:

    1. 在「比對類型」中,選取任何路徑比對選項。
    2. 在「路徑比對」部分,指定名稱、路徑或範本。建議使用萬用字元模式比對

      如有需要,請選取「為路徑值啟用區分大小寫的功能」

    3. 選用:選取「標頭相符」和「查詢參數相符」。 然後按一下相關按鈕,新增標頭和查詢參數。 並為每個參數指定名稱、比對類型和值。

      詳情請參閱「依據標頭和查詢參數比對」。

    4. 如要儲存比對條件,請按一下「完成」

  10. 在「主要動作」部分,選取下列其中一個選項:

    • 從來源擷取:如要將要求導向特定來源,請選取這個選項,然後選取來源。

    • 網址重新導向:如要重新導向要求,請選取這個選項。然後指定重新導向類型、路徑和狀態碼。

      選用:選取選項,將所有回應重新導向至 HTTPS,或移除查詢。

  11. 按一下 [Advanced configurations] (進階設定)

    1. 在「Header action」(標頭動作) 部分,按一下「Add an item」(新增項目)

      選取動作類型,然後將標頭指定為名稱和值配對。然後按一下「完成」

    2. 在「Route action」(轉送動作) 部分,按一下「Add an item」(新增項目)

      指定動作類型和相關選項。然後按一下「完成」

  12. 如要篩選 HTTP 方法,請選取「自訂 HTTP 方法篩選功能」

    然後選取要 Proxy 至來源的 HTTP 方法

  13. 如要儲存路徑規則,請按一下「儲存」

  14. 如要儲存服務變更,請按一下「更新服務」

gcloud 和 YAML

  1. 將 Media CDN 設定匯出為 YAML 檔案。使用 gcloud edge-cache services export 指令

    gcloud edge-cache services export SERVICE_NAME \
        --destination=FILENAME.yaml
    

    更改下列內容:

    • SERVICE_NAME:服務名稱
    • FILENAME:YAML 檔案的名稱
  2. 請按照本頁各節的說明,使用必要設定更新 YAML 檔案。

  3. 如要更新服務,請從 YAML 檔案匯入 Media CDN 設定。使用 gcloud edge-cache services import 指令

    gcloud edge-cache services import SERVICE_NAME \
        --source=FILENAME.yaml
    

比對要求

Media CDN 設定包含一組在轉送部分定義的路徑,適用於EdgeCacheService資源。這些路徑會根據 (至少) 主機比對要求。如要進一步瞭解流量如何導向來源,請參閱 HostRulePathMatcher。每條路徑都能定義自己的 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 條件符合完整網址路徑,但不包含查詢字串。如有需要,請務必指定尾端斜線。

如果路線的相符規則為 fullPathMatch: "/stream/",則會與 /stream/ 相符,但與 /stream/stream/us/hls/1234.ts 不相符。

fullPathMatch 代表明確 (完全) 比對。

matchRules[].prefixMatch prefixMatch 條件會比對網址路徑前置字元,開頭為相同字串的網址會相符。

如果路徑的比對規則為 prefixMatch: "/videos/",則 /videos/hls/58481314/manifest.m3u8/videos/dash 都符合條件,因為兩者都包含 /videos/ 前置字串。

matchRules[].pathTemplateMatch pathTemplateMatch 條件支援萬用字元運算子,可比對複雜的網址模式和路徑區段,以及擷取具名變數來重新編寫網址。

如果路徑的比對規則為 pathTemplateMatch: "/**.m3u8",則會比對所有以 .m3u8 結尾的網址路徑。

/content/en-GB/13/51491/manifest_193193.m3u8/p/abc/1234/manifest_1080p5000.m3u8 都符合這個模式。

如需更多範例,請參閱「模式比對」一節。

詳情請參閱 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=**}

與零個以上路徑區段相符的具名變數。

如有,必須是最後一個運算子。

/**.m3u8/{path=**}.m3u8 會比對副檔名之前的所有路徑片段。

/videos/{file=**} 會比對 /videos/en-GB/def566/manifest.m3u8,包括副檔名,並擷取路徑變數 file="en-GB/def566/manifest.m3u8

注意:

  • 如果沒有重寫網址,請使用較簡單的 *** 運算子。
  • 使用變數擷取路徑區段時,網址中未由變數擷取的任何部分,都無法在後續的 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.tsmaster.m3u8
  • pathTemplateRewrite 同一條路徑中,您會參照在 pathTemplateMatch 中擷取的部分變數。您明確省略 {country}{lang} 變數,因為這些變數與來源上的目錄結構不符。

在這個範例中,會發生下列情況:

  • 傳入的要求網址 /us/en/hls/123139139/segment_00001.ts 符合 pathTemplateMatch,且在傳送至來源前會重新編寫為 /123139139/hls/segment_00001.ts
  • 傳入要求網址 /us/123139139/master.m3u8」符合 pathTemplateMatch,並收到 HTTP 404 (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.comus.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,並將前置字元比對設為 / (比對所有要求路徑)。
  • 在路徑上設定 originurlRedirect (其中一個)。

舉例來說,如要設定全部接收路徑,將所有不相符的要求導向名為 my-origin 的預設來源,請建立具有 priority: 999matchRules[].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 將 GETHEADOPTIONS 方法傳送至來源,並篩除可修改來源的方法。

如要覆寫特定路徑規則的預設行為,請指定要 Proxy 至來源的方法。除了 GETHEADOPTIONS 之外,Media CDN 還支援 PUTPOSTDELETEPATCH

Media CDN 只會針對使用較安全 HTTP 方法 (例如 GETHEADOPTIONS) 的要求重試或嘗試容錯移轉。

如要為路由規則設定一組方法的支援,請指定 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

重新編寫路徑,移除與要求相符的 prefixMatch 中指定的前置字元。

單一路徑規則只能指定 pathPrefixRewritepathTemplateRewrite 其中之一。

urlRewrite.pathTemplateRewrite

pathTemplateRewrite 只能與同一路徑上的相應 pathTemplateMatch 比對規則搭配使用。

單一路徑規則只能指定 pathPrefixRewritepathTemplateRewrite 其中之一。

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/*。您也可以在單一路徑中同時重新編寫主機和路徑。

範例:使用變數改寫網址

如要使用 pathTemplateMatchpathTemplateRewrite 重新編寫傳入要求網址的部分內容,請參閱擷取變數一節。

重新導向要求

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 (永久重新導向)

注意:

  • 路徑可將流量導向來源,或將重新導向傳回給用戶端。你無法同時設定 originurlRedirect 欄位。
  • 如要將路徑重新導向至 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,您可以同時設定 hostRewritepathPrefixRewrite,從原始要求中移除這個前置字串:

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-OriginAccess-Control-Max-AgeAccess-Control-Allow-Headers。這些標頭可讓您對 Media CDN 服務進行跨源呼叫,這些服務可能與網站前端託管在不同網域 (來源),並可能禁止您未明確允許的跨源要求。

舉例來說,player.example.comapi.example.com 是不同的來源 (以瀏覽器來說),您可能希望前端應用程式向 api.example.com 發出要求,以擷取下一個播放清單或重新整理相關內容清單。同樣地,player.example.com可能需要與 cdn.example.com 聯絡,才能擷取影片播放清單和影片片段:cdn.example.com 需要指出這沒問題,且 player.example.comallowed 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://video.example.com 提供,但面向使用者的入口網站是從 https://stream.example.com 提供,您就必須將 https://stream.example.com 新增為允許的來源。

Access-Control-Allow-Origins: https://stream.example.com
maxAge

設定 Access-Control-Max-Age 回應標頭,指定瀏覽器用戶端應快取 CORS 預檢要求回應的時間長度 (以秒為單位)。

即使指定最大值 (86400 秒),部分瀏覽器仍會將這項設定限制在 2 小時以下。

Access-Control-Max-Age: 7200
allowMethods

設定 Access-Control-Allow-Methods 回應標頭,指定允許存取資源的 HTTP 方法。

根據預設,Media CDN 僅支援 GETHEADOPTIONS 方法。如要設定其他方法的支援功能,請參閱路徑方法

Access-Control-Allow-Methods: GET, OPTIONS, HEAD
allowHeaders

設定 Access-Control-Allow-Headers 標頭,決定可在 CORS 要求中傳送哪些標頭。

影片播放器通常需要這麼做,因為在跨來源要求影片內容時,播放器需要存取某些回應標頭。

Access-Control-Allow-Headers: Content-Type, If-Modified-Since, Range, User-Agent
exposeHeaders

設定 Access-Control-Expose-Headers 回應標頭,決定用戶端 JavaScript 可存取哪些標頭。

視訊播放器通常會要求這麼做,因為在跨來源要求內容時,可能需要存取視訊內容的特定回應標頭。

Access-Control-Expose-Headers: Date, Cache-Status, Content-Type, Content-Length
allowCredentials

設定 Access-Control-Allow-Credentials 回應標頭,允許用戶端 JavaScript 檢查要求的回應 (包含憑證)。

如果設為 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,且只能定義 prefixMatchfullPathMatchpathTemplateMatch 其中一個。如果您未加入其中一個欄位,API 會傳回錯誤。
  • 確認每個路徑的 priority 設定正確:較明確 (較長) 的路徑應優先於較短、較廣的路徑比對。
  • 根據預設,系統僅支援 GETHEADOPTIONS 要求。如要設定其他方法的支援功能,請參閱路徑方法。如果特定路徑未啟用某些方法,系統會以 HTTP 405 (Method Not Allowed) 錯誤拒絕這些方法。
  • 系統會拒絕含有主體的 HTTP GET 要求,或任何含有尾部的要求,並傳回 HTTP 400 錯誤,因為 GET 要求不允許有要求主體。
  • 查詢參數和標頭比對是邏輯「AND」運算子,要求必須比對所有查詢參數或標頭鍵 (和值,如果指定的話),才能比對給定的路徑。

後續步驟