設定服務路徑

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

設定轉送規則

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

控制台

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

    前往 Media CDN

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

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

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

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

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

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

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

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

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

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

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

  9. 在「比對」部分,至少指定一個比對條件。按一下「新增比對條件」。接著,請按照下列步驟操作:

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

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

    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 標頭和來源對應。路線可以共用來源。

舉例來說,您可以將資訊清單要求轉送至特定來源,並定義短效快取 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 條件會比對完整網址路徑,但不包含查詢字串。您必須指定尾部斜線 (如有必要)。

路徑的比對規則為 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 個運算子 (萬用字元或變數)。pathTemplateMatchpathTemplateRewrite 欄位的長度不得超過 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.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 傳送,*.vod.example.comhostRules[].hosts[] 項目會與 us.vod.example.comus.vod.example.com:80 相符。
  • 如果要求是透過 HTTPS (TLS) 傳送,*.vod.example.comhostRules[].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,前置字元比對 / (比對所有要求路徑)。
  • 在路線上設定 (其中一個) originurlRedirect

舉例來說,如要設定全部接收的路徑,將所有不相符的要求導向名為 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 只會將 GETHEADOPTIONS 方法 Proxy 到來源,並篩除可修改來源的方法。

您可以指定要將哪些方法轉送至來源,藉此覆寫特定路徑規則的預設行為。除了 GETHEADOPTIONS 之外,Media CDN 也支援 PUTPOSTDELETEPATCH

如要為路徑規則的一系列方法設定支援功能,請指定 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

重新撰寫路徑,移除與要求相符的 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 儲存空間值區、Azure Blob 儲存空間和其他儲存空間供應商。如果您採用多雲架構,或尚未使用 Storage 移轉服務將資料遷移至 Cloud Storage,這項功能就非常實用。

在 AWS S3 中設定虛擬代管值區的最低來源設定:

name: MY_S3_ORIGIN
originAddress: BUCKET-NAME.s3.REGION.amazonaws.com

如果您使用的值區名稱與為 EdgeCacheService 資源設定的主機名稱不相符,則必須針對與此來源 (或來源) 相關聯的路徑設定主機重寫。否則,從來源擷取時,系統會使用由用戶端要求設定的主機標頭。

舉例來說,如要將路徑前置字串為 /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

您可以使用 Media CDN,在 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"]

在 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://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 要求會代理至來源。 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,且定義的 prefixMatchfullPathMatchpathTemplateMatch 必須各有一個。如果您未納入其中一個欄位,API 就會傳回錯誤。
  • 請確認每個路徑的 priority 設定正確無誤:較具體 (較長) 的路徑應優先於較短、較廣泛的路徑比對。
  • 根據預設,系統僅支援 GETHEADOPTIONS 要求。如要設定其他方法的支援功能,請參閱「路徑方法」。系統會拒絕未為特定路徑啟用的 HTTP 方法,並傳回 HTTP 405 (Method Not Allowed) 錯誤。
  • 含有主體的 HTTP GET 要求,或含有預告片的任何要求,都會因 HTTP 400 錯誤而遭到拒絕,因為 GET 要求不允許使用要求主體。
  • 查詢參數和標頭比對是邏輯「AND」運算子,也就是說,要求必須符合所有查詢參數或標頭鍵 (以及指定的值),才能符合指定路徑。

後續步驟