Mengonfigurasi rute layanan

Media CDN menyediakan kemampuan pemilihan rute HTTP tingkat lanjut yang memungkinkan Anda memetakan traffic ke konfigurasi dan origin edge tertentu pada level yang sangat mendetail.

Mengonfigurasi aturan rute

Mengonfigurasi aturan rute untuk layanan Media CDN.

Konsol

  1. Di konsol Google Cloud, buka halaman Media CDN.

    Buka Media CDN

  2. Untuk membuka halaman Details layanan yang ingin Anda konfigurasikan aturan rutenya, klik nama layanan.

  3. Untuk beralih ke mode edit, klik tombol Edit.

  4. Untuk membuka bagian Pemilihan rute, klik Berikutnya.

  5. Tentukan minimal satu aturan host. Klik Tambahkan aturan host. Kemudian, lakukan hal berikut:

    1. Untuk Host, tentukan minimal satu host untuk pencocokan.

    2. Untuk Deskripsi, berikan deskripsi singkat untuk aturan host.

    Atau, untuk mengedit aturan host, klik panah untuk meluaskan aturan tersebut.

  6. Tentukan minimal satu aturan rute. Klik Tambahkan aturan rute.

    Atau, untuk mengedit aturan rute, klik Edit pada baris masing-masing.

  7. Di panel Edit route rule, untuk Priority, tetapkan nilai untuk route priority.

  8. Untuk Deskripsi, berikan deskripsi singkat yang dapat membantu mengidentifikasi aturan dalam daftar aturan.

  9. Di bagian Pencocokan, tentukan minimal satu kondisi pencocokan. Klik Tambahkan kondisi kecocokan. Kemudian, lakukan hal berikut:

    1. Untuk Jenis pencocokan, pilih opsi pencocokan jalur.
    2. Untuk Pencocokan jalur, tentukan nama, jalur, atau template. Pertimbangkan untuk menggunakan pencocokan pola karakter pengganti.

      Jika diperlukan, pilih juga Aktifkan kepekaan huruf besar/kecil untuk nilai jalur.

    3. Opsional: Pilih Header cocok dan Parameter kueri cocok. Kemudian, klik tombol yang relevan untuk menambahkan header dan parameter kueri. Untuk setiap kolom, tentukan nama, jenis pencocokan, dan nilai.

      Untuk informasi selengkapnya, lihat Pencocokan pada header dan parameter kueri.

    4. Untuk menyimpan kondisi kecocokan, klik Selesai.

  10. Untuk Primary action, pilih salah satu opsi berikut:

    • Mengambil dari origin: Untuk mengarahkan permintaan ke origin tertentu, pilih opsi ini, lalu pilih origin.

    • Pengalihan URL: Untuk mengalihkan permintaan, pilih opsi ini. Kemudian, tentukan jenis pengalihan, jalur, dan kode status.

      Secara opsional, pilih opsi untuk mengarahkan semua respons ke HTTPS, atau untuk menghapus kueri.

  11. Klik Advanced configurations.

    1. Di bagian Tindakan header, klik Tambahkan item.

      Pilih jenis tindakan, lalu tentukan header sebagai pasangan nama dan nilai. Kemudian, klik Done.

    2. Di bagian Tindakan rute, klik Tambahkan item.

      Tentukan jenis tindakan dan opsi terkaitnya. Kemudian, klik Done.

  12. Untuk Pemfilteran metode HTTP, pilih Sesuaikan pemfilteran metode HTTP.

    Kemudian, pilih metode HTTP yang ingin Anda proxy ke origin.

  13. Untuk menyimpan aturan rute, klik Simpan.

  14. Untuk menyimpan perubahan pada layanan, klik Perbarui layanan.

gcloud dan YAML

  1. Ekspor konfigurasi Media CDN Anda ke dalam file YAML. Gunakan perintah gcloud edge-cache services export.

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

    Ganti kode berikut:

    • SERVICE_NAME: Nama layanan Anda.
    • FILENAME : nama file YAML Anda
  2. Perbarui file YAML dengan konfigurasi yang diperlukan seperti yang dijelaskan di bagian di halaman ini.

  3. Untuk mengupdate layanan, impor konfigurasi Media CDN Anda dari file YAML. Gunakan perintah gcloud edge-cache services import.

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

Permintaan yang cocok

Konfigurasi Media CDN berisi kumpulan rute yang ditentukan di bagian Routing untuk resource EdgeCacheService. Rute ini mencocokkan permintaan berdasarkan (minimal) host. Untuk mengetahui detail selengkapnya tentang cara traffic diarahkan ke origin, lihat HostRule dan PathMatcher. Setiap rute dapat menentukan konfigurasi CDN, penulisan ulang, pengalihan, kebijakan CORS, header HTTP kustom, dan pemetaan origin-nya sendiri. Rute dapat memiliki asal yang sama.

Misalnya, Anda dapat merutekan permintaan untuk manifes ke origin tertentu dan menentukan TTL cache berumur pendek serta kebijakan caching negatif. Permintaan untuk segmen dapat dibagi ke origin lain menggunakan header dan parameter kueri untuk memisahkan jenis manifes atau pengguna tertentu.

Contoh berikut menunjukkan cara merutekan permintaan yang cocok dengan header, parameter kueri, dan awalan jalur tertentu untuk host 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

Pencocokan jalur

Media CDN mendukung pencocokan jalur lengkap (persis), awalan, dan karakter pengganti. Pencocokan jalur dapat digabungkan dengan pencocokan berbasis parameter host, header, dan kueri untuk membuat aturan perutean permintaan yang terperinci.

Berikut adalah tiga cara untuk mencocokkan jalur URL.

Kolom Deskripsi Contoh
matchRules[].fullPathMatch Kondisi fullPathMatch cocok dengan jalur URL lengkap, yang tidak menyertakan string kueri. Anda harus menentukan garis miring di akhir, jika relevan.

Rute dengan aturan pencocokan fullPathMatch: "/stream/" cocok dengan /stream/, tetapi tidak cocok dengan /stream atau /stream/us/hls/1234.ts.

fullPathMatch adalah pencocokan eksplisit (persis).

matchRules[].prefixMatch Kondisi prefixMatch cocok dengan awalan jalur URL; URL yang dimulai dengan string yang sama akan cocok.

Rute dengan aturan pencocokan prefixMatch: "/videos/" cocok dengan /videos/hls/58481314/manifest.m3u8 dan /videos/dash karena keduanya berisi awalan /videos/.

matchRules[].pathTemplateMatch Kondisi pathTemplateMatch mendukung operator karakter pengganti, yang memungkinkan Anda mencocokkan pola URL dan segmen jalur yang kompleks, serta mengambil variabel bernama untuk menulis ulang URL.

Rute dengan aturan pencocokan pathTemplateMatch: "/**.m3u8" cocok dengan jalur URL apa pun yang berakhir dengan .m3u8.

/content/en-GB/13/51491/manifest_193193.m3u8 dan /p/abc/1234/manifest_1080p5000.m3u8 cocok dengan pola ini.

Untuk contoh lainnya, lihat bagian pencocokan pola.

Untuk detail selengkapnya, lihat spesifikasi API untuk MatchRule.

Misalnya, untuk mencocokkan semua permintaan yang dimulai dengan /stream/, buat aturan rute yang mirip dengan berikut:

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/

Contoh ini secara eksplisit menyertakan garis miring di akhir dalam aturan pencocokan:

  • Permintaan ke media.example.com/stream/id/1234/hls/manifest.m3u8 cocok dengan rute ini.
  • Permintaan ke media.example.com/stream-eu/id/4567/hls/manifest.m3u8 tidak cocok dengan rute ini.

Dalam kasus kedua, Media CDN menampilkan error 404 HTTP, kecuali jika ada rute lain atau rute generik yang dikonfigurasi.

Untuk panduan tentang cara kerja prioritas untuk rute dengan awalan yang serupa, lihat bagian prioritas dan pengurutan rute.

Pencocokan pola (karakter pengganti)

Pencocokan pola memungkinkan Anda mencocokkan beberapa bagian URL, termasuk URL parsial dan akhiran (ekstensi file), dengan menggunakan sintaksis karakter pengganti.

Anda juga dapat mengaitkan satu atau beberapa segmen jalur dengan variabel bernama di kolom pathTemplateMatch, lalu merujuk ke variabel tersebut saat menulis ulang URL di kolom pathTemplateRewrite. Dengan begitu, Anda dapat mengurutkan ulang dan menghapus segmen URL sebelum permintaan dikirim ke origin.

Contoh berikut menunjukkan cara mencocokkan dua akhiran URL yang berbeda:

# EdgeCacheService.routing.pathMatchers[]
    routeRules:
    - priority: 1
      description: "Match video segments"
      matchRules:
      - pathTemplateMatch: "/**.ts"
      - pathTemplateMatch: "/**.m4s"
      origin: prod-video-storage

Sintaksis yang didukung mencakup hal berikut.

Operator Mencocokkan dengan Contoh
* Cocok dengan satu segmen jalur, hingga pemisah jalur berikutnya: / /videos/*/*/*.m4s cocok dengan /videos/123414/hls/1080p5000_00001.m4s.
** Mencocokkan nol atau beberapa segmen jalur. Jika ada, harus berupa operator terakhir. /**.mpd cocok dengan /content/123/india/dash/55/manifest.mpd.
{name} or {name=*}

Variabel bernama yang cocok dengan satu segmen jalur.

Cocok dengan satu segmen jalur, hingga pemisah jalur berikutnya: /.

/content/{format}/{lang}/{id}/{file}.vtt cocok dengan /content/hls/en-us/12345/en_193913.vtt dan mengambil format="hls", lang="en-us", id="12345", dan file="en_193913" sebagai variabel.
{name=videos/*} Variabel bernama yang cocok dengan lebih dari satu segmen jalur. Segmen jalur yang cocok dengan videos/* akan diambil sebagai variabel bernama. /videos/{language=lang/*}/* cocok dengan /videos/lang/en/video.m4s dan mengisi variabel jalur language dengan nilai lang/en.
{name=**}

Variabel bernama yang cocok dengan nol atau beberapa segmen jalur.

Jika ada, harus berupa operator terakhir.

/**.m3u8 atau /{path=**}.m3u8 cocok dengan semua segmen jalur hingga ekstensi.

/videos/{file=**} cocok dengan /videos/en-GB/def566/manifest.m3u8, termasuk ekstensi, dan mengambil variabel jalur file="en-GB/def566/manifest.m3u8.

Catatan:

  • Jika Anda tidak menulis ulang URL, gunakan operator * dan ** yang lebih sederhana.
  • Saat menggunakan variabel untuk mengambil segmen jalur, setiap bagian URL yang tidak diambil oleh variabel tidak dapat direferensikan dalam pathTemplateRewrite berikutnya. Untuk contohnya, lihat bagian mengambil variabel jalur.
  • Anda tidak dapat merujuk ke variabel dalam pathTemplateRewrite berikutnya yang tidak ada di pathTemplateMatch pada rute yang sama.
  • Variabel peka huruf besar/kecil, dengan{FORMAT}, {forMAT}, dan {format} mewakili variabel dan nilai yang berbeda.
  • Anda dapat menentukan hingga 10 operator (karakter pengganti atau variabel) dalam kecocokan. Kolom pathTemplateMatch dan pathTemplateRewrite tidak boleh melebihi 255 karakter.

Contoh: Mencocokkan ekstensi file

Contoh berikut menunjukkan kasus penggunaan umum untuk operator karakter pengganti: mencocokkan semua segmen jalur hingga akhiran.

Dalam hal ini, Anda akan melakukan hal berikut:

  • Ambil manifes video (playlist) yang diakhiri dengan .m3u8 dan .mpd dari asal manifes, dengan menerapkan TTL singkat (5 detik) ke respons ini karena respons tersebut berubah secara berkala.
  • Ambil segmen video yang diakhiri dengan .ts dan .m4s dari asal segmen, dan terapkan TTL yang lebih lama (1 hari) ke respons ini.

Pendekatan ini sering digunakan saat menggunakan layanan SSAI (Penyisipan Iklan Sisi Server) atau DAI (Penyisipan Iklan Dinamis), dan untuk video live dengan manifes yang diperbarui setiap beberapa detik.

Konfigurasi berikut menunjukkan cara mengonfigurasi perutean Media CDN untuk mendukung hal ini:

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

Contoh: Menangkap variabel jalur

Contoh berikut menunjukkan cara menggunakan variabel bernama untuk mendeskripsikan satu atau beberapa segmen jalur.

Variabel ini dapat digunakan dalam pathTemplateRewrite untuk menulis ulang jalur sebelum permintaan dikirim ke origin, atau untuk membuat pathTemplateMatch kompleks yang mendeskripsikan dirinya sendiri.

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}"

Secara khusus:

  • Setiap variabel {name} menangkap satu segmen jalur. Segmen jalur adalah semua karakter di antara sepasang / ("garis miring") di jalur URL.
  • Variabel {name=**} menangkap semua segmen jalur yang tersisa; dalam hal ini, variabel tersebut cocok dengan segments/00001.ts dan master.m3u8.
  • Di pathTemplateRewrite di rute yang sama, Anda merujuk kembali ke beberapa variabel yang Anda tangkap di pathTemplateMatch. Anda secara eksplisit menghapus variabel {country} dan {lang} karena tidak cocok dengan struktur direktori di origin.

Dengan contoh ini, hal berikut akan terjadi:

  • URL permintaan masuk /us/en/hls/123139139/segment_00001.ts cocok dengan pathTemplateMatch dan ditulis ulang menjadi /123139139/hls/segment_00001.ts sebelum dikirim ke origin.
  • URL permintaan masuk /us/123139139/master.m3u8 tidak cocok dengan pathTemplateMatch, dan menerima respons 404 (Not Found) HTTP.
  • URL permintaan masuk /br/es/dash/c966cbbe6ae3/subtitle_00001.vtt juga cocok dengan pathTemplateMatch dan ditulis ulang menjadi /c966cbbe6ae3/dash/subtitle_00001.vtt sebelum dikirim ke origin.

Untuk mempelajari lebih lanjut cara pencocokan karakter pengganti berinteraksi dengan penulisan ulang URL, lihat bagian penulisan ulang.

Pencocokan host

Setiap layanan dapat cocok dengan beberapa nama host, dengan setiap kumpulan nama host berisi grup rutenya sendiri (dikenal sebagai pencocok jalur). Dalam kasus yang paling umum, semua nama host untuk layanan dipetakan ke satu kumpulan rute bersama dengan satu daftar host dan satu pencocok jalur.

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

Host yang tidak cocok akan ditayangkan halaman 404 HTTP default. Untuk menerima host apa pun, Anda dapat menyertakan karakter pengganti * sebagai entri hostRules[].hosts[].

Anda juga dapat menentukan grup rute (misalnya, pengelompokan menurut negara atau live versus on demand). Karena setiap layanan memiliki satu kebijakan keamanan, kami umumnya merekomendasikan untuk memiliki satu layanan untuk setiap pasar (geografi) atau beban kerja yang Anda miliki.

Catatan:

  • Header host (atau :authority HTTP/2) yang berisi port secara implisit dicocokkan dengan host yang dikonfigurasi. Anda tidak perlu menentukan port secara eksplisit.
  • Jika permintaan dilakukan melalui HTTP, entri hostRules[].hosts[] dari *.vod.example.com akan cocok dengan us.vod.example.com dan us.vod.example.com:80.
  • Jika permintaan dilakukan melalui HTTPS (TLS), entri hostRules[].hosts[] dari *.vod.example.com akan cocok dengan us.vod.example.com:443.

Untuk detail selengkapnya, lihat spesifikasi API untuk HostRule.

Mencocokkan header dan parameter kueri

Anda dapat mengonfigurasi rute agar cocok dengan nama header dan parameter kueri tertentu, serta keberadaan nilai header (awalan, akhiran, atau kecocokan persis).

Pencocokan parameter kueri dan header adalah "AND" logis—permintaan harus cocok dengan semua parameter kueri dan kunci header (dan nilai, jika ditentukan) agar cocok dengan rute yang diberikan.

Misalnya, jika Anda ingin merutekan permintaan dengan nama kolom header dan nilai header tertentu ke origin bernama alternate-origin, konfigurasikan kondisi pencocokan dalam 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"

Dalam contoh ini, permintaan dengan /videos/ di awal URL dan header x-device-name: roku cocok dengan rute ini. Permintaan yang tidak memiliki nama header ini atau dengan nilai yang berbeda tidak cocok dengan rute ini.

Untuk detail selengkapnya, lihat spesifikasi API untuk HeaderMatch.

Demikian pula, untuk mencocokkan dengan parameter kueri, tentukan satu atau beberapa queryParameterMatches sebagai berikut:

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"

Dalam contoh ini, permintaan klien https://cdn.example.com/videos/1234/abcd/xyz.m3u8?playback_type=live&geo=eu cocok dengan rute ini.

Untuk detail selengkapnya, lihat spesifikasi API untuk QueryParameterMatcher.

Menentukan rute generik (default)

Secara default, Media CDN menampilkan error 404 (Not Found) HTTP jika permintaan tidak cocok dengan rute yang dikonfigurasi.

Untuk mengonfigurasi rute catch-all, untuk pathMatcher tertentu (kumpulan rute), lakukan hal berikut:

  • Buat routeRule dengan prioritas terendah (angka tertinggi)—misalnya, 999, yang merupakan prioritas rute terendah.
  • Konfigurasikan matchRule dengan kecocokan awalan / (cocok dengan semua jalur permintaan).
  • Konfigurasikan (salah satu) origin atau urlRedirect di rute.

Misalnya, untuk mengonfigurasi rute generik yang mengarahkan semua permintaan yang tidak cocok ke asal default bernama my-origin, buat rute baru dengan priority: 999 dan matchRules[].prefixMatch dari / sebagai berikut:

name: prod-service
routing:
  hostRules:
  - hosts:
    - cdn.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 999
      origin: my-origin
      matchRules:
      - prefixMatch: /

Anda dapat menulis ulang URL sebelum pengambilan origin, atau mengalihkan ke halaman default (seperti halaman landing) daripada mengirim permintaan "apa adanya" ke origin.

Prioritas dan pengurutan rute

Setiap rute dalam array routeRules[] harus memiliki priority yang terkait dengan ruten tersebut.

Rute yang lebih spesifik harus ditetapkan ke prioritas yang lebih tinggi (angka yang lebih kecil). Rute yang cocok dengan awalan /stream/ dengan prioritas 1 akan mencegah rute /stream/live/eu/ yang lebih spesifik dengan prioritas 5 cocok dengan permintaan apa pun.

  • Rute prioritas tertinggi adalah "1", dan terendah adalah "999".
  • Anda tidak dapat mengonfigurasi dua atau beberapa routeRules dengan prioritas yang sama. Prioritas untuk setiap aturan harus ditetapkan ke angka antara 1 dan 999 inklusif.
  • Dengan menentukan rute generik, Anda dapat mengirim semua permintaan yang tidak cocok ke origin default atau mengalihkannya ke halaman landing atau endpoint.

Dalam contoh berikut, Anda dapat melihat bahwa rute /live/us/ tidak akan pernah cocok karena rute /live/ memiliki prioritas yang lebih tinggi:

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: /

Untuk mengatasi hal ini, Anda menempatkan rute yang lebih spesifik (lebih panjang) dengan prioritas yang lebih tinggi:

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: /

Hal ini memungkinkan rute yang lebih spesifik untuk mencocokkan permintaan dengan benar. Permintaan dengan awalan /live/eu/ akan tetap dialihkan ke rute /live/ dengan prioritas 2.

Pemfilteran metode

Secara default, Media CDN hanya mem-proxy metode GET, HEAD, dan OPTIONS ke origin Anda dan memfilter metode yang dapat mengubah origin Anda.

Anda dapat mengganti perilaku default ini untuk aturan rute tertentu dengan menentukan metode yang ingin di-proxy ke origin. Selain GET, HEAD, dan OPTIONS, Media CDN mendukung PUT, POST, DELETE, dan PATCH.

Untuk mengonfigurasi dukungan bagi serangkaian metode untuk aturan rute, tentukan bagian routeMethods yang memiliki nilai allowed_methods untuk setiap metode.

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

Normalisasi jalur

Normalisasi jalur menjelaskan cara Media CDN menggabungkan beberapa representasi URL menjadi satu representasi kanonis dalam skenario tertentu.

Normalisasi jalur dapat langsung meningkatkan rasio hit cache dengan mengurangi jumlah URL permintaan yang mewakili konten yang sama, dan dengan mengurangi error origin untuk origin yang mengharapkan jalur yang dinormalisasi.

Permintaan masuk dinormalisasi sesuai dengan hal berikut:

  • Beberapa garis miring berturut-turut digabungkan menjadi satu garis miring. Misalnya, jalur URL /videos///12345/manifest.mpd dinormalisasi menjadi /videos/12345/manifest.mpd.
  • Segmen jalur dinormalisasi sesuai dengan RFC 3986 Bagian 6.2.2.3. Misalnya, jalur /a/b/c/./../../g dinormalisasi ke /a/g berdasarkan algoritma "remove dot segments" yang ditentukan dalam RFC 3986. Normalisasi ini terjadi sebelum memeriksa cache atau meneruskan permintaan ke origin.
  • Permintaan tidak dinormalisasi dengan encoding persen. Misalnya, URL dengan karakter garis miring yang dienkode persen (%2F) tidak didekode ke dalam bentuk yang tidak dienkode.

URL tetap peka huruf besar/kecil dan tidak dinormalisasi huruf besar/kecil. Banyak URL berisi enkode base64 yang peka huruf besar/kecil, termasuk URL dengan token permintaan ditandatangani.

Penulisan ulang dan pengalihan

Bagian berikut memberikan contoh cara menulis ulang permintaan dan mengonfigurasi pengalihan.

Menulis ulang URL permintaan

Media CDN mendukung penulisan ulang host dan jalur. Penulisan ulang mengubah URL yang dikirim ke origin dan memungkinkan Anda mengubah host dan jalur sesuai kebutuhan. Penulisan ulang host dan jalur berada di tingkat rute, sehingga Anda dapat menentukan permintaan tertentu yang ditulis ulang berdasarkan pencocok apa pun, termasuk jalur, parameter kueri, dan header permintaan.

Untuk detail selengkapnya, lihat spesifikasi API untuk RouteAction.UrlRewrite.

Berikut adalah tiga cara untuk menulis ulang permintaan:

Kolom Deskripsi
urlRewrite.pathPrefixRewrite

Menulis ulang jalur, menghapus awalan yang ditentukan dalam prefixMatch yang cocok dengan permintaan.

Hanya salah satu dari pathPrefixRewrite atau pathTemplateRewrite yang dapat ditentukan dalam satu aturan rute.

urlRewrite.pathTemplateRewrite

pathTemplateRewrite hanya dapat digunakan dengan aturan kecocokan pathTemplateMatch yang sesuai di rute yang sama.

Hanya salah satu dari pathPrefixRewrite atau pathTemplateRewrite yang dapat ditentukan dalam satu aturan rute.

urlRewrite.hostRewrite Menulis ulang host sebelum permintaan dikirim ke server asal.

Catatan:

  • URL yang ditulis ulang tidak mengubah kunci cache. Kunci cache didasarkan pada URL permintaan yang dikirim oleh klien.
  • Penulisan ulang terjadi setelah pencocokan rute dan validasi permintaan yang ditandatangani. Rute tidak dicocokkan ulang dengan aturan pencocokan lain.

Contoh: Menghapus awalan jalur

Misalnya, untuk menulis ulang URL permintaan klien dari /vod/videos/hls/1234/abc.ts ke /videos/hls/1234/abc.ts (menghapus /vod dari jalur), Anda dapat menggunakan fitur 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 berfungsi dengan mengganti seluruh awalan jalur yang cocok di matchRules[].prefixMatch dengan nilai pathPrefixRewrite.

Untuk menulis ulang nama host (misalnya, menulis ulang cdn.example.com menjadi my-bucket.s3.us-west-2.amazonaws.com), Anda dapat mengonfigurasi hal berikut:

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"

Dalam hal ini, URL permintaan origin akan berubah dari cdn.example.com/videos/* menjadi my-bucket.s3.us-west-2.amazonaws.com/videos/*. Anda juga dapat menggabungkan penulisan ulang host dan jalur dalam satu rute.

Contoh: Menggunakan variabel untuk menulis ulang URL

Untuk menggunakan pathTemplateMatch dan pathTemplateRewrite guna menulis ulang bagian-bagian URL permintaan masuk, lihat bagian mengambil variabel.

Permintaan pengalihan

Media CDN mendukung tiga jenis pengalihan:

  • Pengalihan host, yang hanya mengalihkan host (domain), sehingga jalur dan parameter kueri tidak berubah.
  • Pengalihan jalur, yang mengganti jalur sepenuhnya.
  • Pengalihan awalan jalur, yang hanya mengganti awalan yang cocok.

Pengalihan default ke HTTP 301 (Moved Permanently), tetapi dapat dikonfigurasi untuk menampilkan kode status pengalihan yang berbeda berdasarkan per rute.

Konfigurasi berikut adalah contoh pengalihan berbasis awalan, tempat Anda mengalihkan pengguna yang mengunjungi https://cdn.example.com/on-demand/* ke 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

Contoh ini juga mengubah pengalihan menjadi pengalihan sementara, yang mencegah klien (seperti browser) menyimpannya ke dalam cache. Hal ini dapat berguna jika Anda ingin mengubahnya dalam waktu dekat.

Nilai redirectResponseCode yang didukung ditampilkan dalam tabel berikut.

Kode respons pengalihan Kode status HTTP
MOVED_PERMANENTLY_DEFAULT HTTP 301 (Dipindahkan Secara Permanen)
FOUND HTTP 302 (Ditemukan)
SEE_OTHER HTTP 303 (Lihat Lainnya)
TEMPORARY_REDIRECT HTTP 307 (Temporary Redirect)
PERMANENT_REDIRECT HTTP 308 (Permanent Redirect)

Catatan:

  • Rute dapat mengarahkan traffic ke origin atau menampilkan pengalihan ke klien. Anda tidak dapat menetapkan kolom origin dan urlRedirect secara bersamaan.
  • Rute yang mengalihkan ke HTTPS memerlukan setidaknya satu sertifikat SSL yang dilampirkan ke layanan.

Untuk detail selengkapnya, lihat spesifikasi API untuk RouteRule.UrlRedirect.

Mengalihkan semua permintaan ke HTTPS

Untuk mengalihkan semua permintaan ke HTTPS (bukan HTTP), Anda dapat mengonfigurasi setiap layanan untuk mengalihkan semua permintaan klien ke HTTPS secara otomatis. Klien yang terhubung melalui HTTP akan menerima respons 301 (Permanent Redirect) HTTP dengan header Location yang ditetapkan ke URL yang sama menggunakan "https://", bukan "http://".

gcloud

gcloud edge-cache services update MY_SERVICE \
    --require-tls
Request issued for: [MY_SERVICE]
Updated service [MY_SERVICE].

Perintah ini menampilkan deskripsi layanan Anda, dengan requireTls kini ditetapkan ke true.

  name: MY_SERVICE
  requireTls: true

Anda juga dapat memilih untuk menetapkan header Strict-Transport-Security sebagai header respons untuk mengarahkan klien agar selalu terhubung langsung melalui HTTPS.

Menggunakan backend penyimpanan pihak ketiga

Media CDN mendukung koneksi ke endpoint HTTP yang dapat dijangkau secara publik di luar Google Cloud, termasuk bucket penyimpanan AWS S3, Azure Blob Storage, dan penyedia penyimpanan lainnya. Hal ini dapat berguna jika Anda memiliki arsitektur multi-cloud, atau belum memigrasikan data ke Cloud Storage menggunakan Storage Transfer Service.

Konfigurasi origin minimal yang mengonfigurasi bucket yang dihosting secara virtual di AWS S3:

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

Jika tidak menggunakan nama bucket yang cocok dengan nama host yang dikonfigurasi untuk resource EdgeCacheService, Anda juga harus mengonfigurasi penulisan ulang host untuk rute yang terkait dengan origin ini (atau origin). Jika tidak, header Host yang ditetapkan oleh permintaan klien akan digunakan saat mengambil dari origin.

Misalnya, untuk memetakan semua permintaan dengan awalan jalur /legacy/ ke bucket eksternal, Anda dapat mengonfigurasi hostRewrite dan pathPrefixRewrite untuk menghapus awalan ini dari permintaan asal:

routeRules:
  - description: legacy backend
    matchRules:
    - prefixMatch: "/legacy/"
    routeAction:
      urlRewrite:
        hostRewrite: BUCKET-NAME.s3.REGION.amazonaws.com
        pathPrefixRewrite: /
      cdnPolicy:
        cacheMode: CACHE_ALL_STATIC
        defaultTtl: 3600s

Untuk mengetahui informasi selengkapnya tentang cara header host ditetapkan pada permintaan origin, lihat dokumentasi header permintaan origin.

Cross-Origin Resource Sharing (CORS)

Cross-Origin Resource Sharing (CORS) adalah pendekatan yang berfokus pada browser untuk membuat permintaan lintas-asal dengan aman. Kebijakan CORS memungkinkan Anda menetapkan header CORS secara otomatis, seperti Access-Control-Allow-Origins, berdasarkan kebijakan per rute.

Mengonfigurasi CORS

CDN Media memungkinkan Anda menentukan kebijakan CORS di rute untuk EdgeCacheService.

Kebijakan CORS menentukan aturan ini dengan kumpulan header HTTP umum. Anda dapat menetapkan header CORS umum dalam respons, seperti Access-Control-Allow-Origin, Access-Control-Max-Age, dan Access-Control-Allow-Headers. Header ini memungkinkan Anda melakukan panggilan lintas origin ke layanan Media CDN yang mungkin dihosting di domain (origin) yang berbeda dari frontend situs Anda dan dapat mencegah permintaan lintas origin yang tidak Anda izinkan secara eksplisit.

Misalnya, player.example.com dan api.example.com adalah origin yang berbeda (dalam arti browser), dan Anda mungkin ingin aplikasi frontend membuat permintaan ke api.example.com untuk mengambil playlist berikutnya atau memuat ulang daftar konten terkait. Demikian pula, player.example.com mungkin perlu menghubungi cdn.example.com untuk mengambil playlist video dan segmen video: cdn.example.com harus menunjukkan bahwa ini tidak masalah, dan bahwa player.example.com adalah allowed origin, serta aturan lainnya (header yang diizinkan, apakah cookie dapat disertakan).

Untuk contoh lain, jika ingin mengizinkan stream.example.com sebagai origin dan header X-Client-ID dalam permintaan CORS, Anda dapat mengonfigurasi corsPolicy di rute, seperti berikut:

corsPolicy: maxAge: 600 allowOrigins: ["stream.example.com"] allowHeaders:
["X-Client-ID"]

corsPolicy dikonfigurasi di routing.pathMatchers[].routeRules[].routeAction.corsPolicy dalam EdgeCacheService. Setiap routeRule dapat menentukan corsPolicy yang berbeda sesuai kebutuhan, atau tidak sama sekali.

Jika Anda menentukan nilai corsPolicy dan juga menetapkan header respons kustom dengan menggunakan kolom responseHeadersToAdd pada rute dengan nama yang sama, header respons kustom akan diprioritaskan, dan digunakan sebagai pengganti nilai corsPolicy.

Jika respons origin menetapkan header HTTP, dan Anda memiliki nilai corsPolicy yang ditetapkan, nilai corsPolicy akan digunakan sebagai gantinya. Nilai tidak diciutkan atau digabungkan untuk menghindari pengiriman nilai header yang tidak valid ke klien, atau menyetel kebijakan yang lebih permisif daripada yang dimaksudkan secara tidak sengaja.

{origin_request_header} khusus diisi dengan header HTTP Origin dalam permintaan klien. Ini dapat ditetapkan sebagai nilai header respons kustom di rute, untuk header Access-Control-Allow-Origin.

Untuk detail selengkapnya, lihat spesifikasi API untuk RouteAction.CORSPolicy.

Kolom kebijakan CORS

Tabel berikut menjelaskan kolom yang terdapat dalam kebijakan CORS.

Kolom Deskripsi Contoh
allowOrigins

Menetapkan header respons Access-Control-Allow-Origins, yang menentukan asal mana yang dapat membuat permintaan lintas-asal di lingkungan browser.

Misalnya, jika konten video Anda ditayangkan dari https://video.example.com, tetapi portal yang ditampilkan kepada pengguna ditayangkan dari https://stream.example.com, Anda akan menambahkan https://stream.example.com sebagai origin yang diizinkan.

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

Menetapkan header respons Access-Control-Max-Age, yang menentukan berapa lama, dalam detik, klien browser harus meng-cache respons ke permintaan pra-penerbangan CORS.

Beberapa browser membatasinya hingga 2 jam atau kurang, meskipun nilai maksimum (86.400 detik) ditentukan.

Access-Control-Max-Age: 7200
allowMethods

Menetapkan header respons Access-Control-Allow-Methods, yang menentukan metode HTTP mana yang diizinkan untuk mengakses resource.

Secara default, Media CDN hanya mendukung metode GET, HEAD, dan OPTIONS. Untuk mengonfigurasi dukungan bagi metode lain, lihat Metode rute.

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

Menetapkan header Access-Control-Allow-Headers, yang menentukan header mana yang dapat dikirim dalam permintaan CORS.

Hal ini sering kali diperlukan oleh pemutar video, yang perlu mengakses beberapa header respons untuk konten video saat memintanya lintas origin.

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

Menetapkan header respons Access-Control-Expose-Headers, yang menentukan header mana yang dapat diakses oleh JavaScript sisi klien.

Hal ini sering kali diperlukan oleh pemutar video, yang mungkin perlu mengakses header respons tertentu untuk konten video saat meminta konten lintas origin.

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

Menetapkan header respons Access-Control-Allow-Credentials, yang memungkinkan JavaScript sisi klien memeriksa respons untuk permintaan dengan menyertakan kredensial.

Header ini dihilangkan jika ditetapkan ke salah (false).

Access-Control-Allow-Credentials: true
disabled Menonaktifkan corsPolicy tanpa menghapusnya. Permintaan pre-flight OPTIONS di-proxy ke origin. T/A

Contoh corsPolicy

Contoh konfigurasi berikut menunjukkan konfigurasi corsPolicy dasar:

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"

Memecahkan masalah pemilihan rute

Jika beberapa permintaan tidak mengambil hasil yang cocok atau menampilkan error, periksa hal berikut:

  • Rute harus memiliki matchRule dengan salah satu dari prefixMatch, fullPathMatch, atau pathTemplateMatch yang ditentukan. API akan menampilkan error jika Anda tidak menyertakan salah satu kolom tersebut.
  • Pastikan priority setiap rute ditetapkan dengan benar: rute yang lebih spesifik (lebih panjang) harus diberi prioritas yang lebih tinggi daripada pencocokan rute yang lebih pendek dan lebih luas.
  • Secara default, hanya permintaan GET, HEAD, dan OPTIONS yang didukung. Untuk mengonfigurasi dukungan bagi metode lain, lihat Metode rute. Metode yang tidak diaktifkan untuk rute tertentu akan ditolak dengan error 405 (Method Not Allowed) HTTP.
  • Permintaan GET HTTP dengan isi, atau permintaan apa pun dengan trailer, ditolak dengan error 400 HTTP, karena isi permintaan tidak diizinkan dalam permintaan GET.
  • Pencocokan parameter kueri dan header adalah "AND" logis—permintaan harus cocok dengan semua kunci parameter kueri atau header (dan nilai, jika ditentukan) untuk cocok dengan rute yang diberikan.

Langkah selanjutnya