媒体 CDN 提供高级 HTTP 路由功能,可让您以精细的级别将流量映射到特定的边缘配置和源。
配置路由规则
为媒体 CDN 服务配置路由规则。
控制台
在 Google Cloud 控制台中,前往 Media CDN 页面。
如需打开要为其配置路线规则的服务的详情页面,请点击相应服务的名称。
如需切换到修改模式,请点击修改按钮。
如需前往路由部分,请点击下一步。
请至少指定一条主机规则。点击添加主机规则。然后,执行以下操作:
对于主机,请至少指定一个要匹配的主机。
在说明中,为主机规则提供简要说明。
或者,如需修改主机规则,请点击箭头将其展开。
请至少指定一条路由规则。点击添加路由规则。
或者,如需修改路由规则,请点击相应行中的
Edit(修改)。在修改路由规则窗格中,为优先级设置路由优先级值。
在说明中,提供简短的说明,以便在规则列表中识别规则。
在“匹配”部分中,至少指定一个匹配条件。点击添加匹配条件。之后,执行以下操作:
- 对于匹配类型,选择任意路径匹配选项。
对于路径匹配,请指定名称、路径或模板。不妨考虑使用通配符模式匹配。
如有需要,还应选择对路径值区分大小写。
可选:选择标头匹配和查询参数匹配。然后,点击相关按钮以添加标头和查询参数。 为每个维度指定名称、匹配类型和值。
如需了解详情,请参阅按标头和查询参数进行匹配。
如需保存匹配条件,请点击完成。
对于主要操作,请选择以下选项之一:
从来源提取:如需将请求定向到特定来源,请选择此选项,然后选择来源。
网址重定向:如需重定向请求,请选择此选项。然后,指定重定向类型、路径和状态代码。
(可选)选择将所有响应重定向到 HTTPS 或剥离查询的选项。
点击高级配置。
在标头操作部分中,点击添加内容。
选择操作类型,然后将标头指定为名称和值对。接着,点击完成。
在路由操作部分中,点击添加内容。
指定操作类型及其相关选项。接着,点击完成。
对于 HTTP 方法过滤,请选择自定义 HTTP 方法过滤。
然后,选择要代理到源的 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
匹配请求
媒体 CDN 配置包含在路由部分为 EdgeCacheService
资源定义的一组路由。这些路由根据(至少)主机来匹配请求。如需详细了解如何将流量引导到来源,请参阅 HostRule
和 PathMatcher
。每个路由都可以定义自己的 CDN 配置、重写、重定向、CORS 政策、自定义 HTTP 标头和源映射。路线可以共用起点。
例如,您可以将清单请求路由到特定来源,并定义短时有效的缓存 TTL 和负缓存政策。您可以使用标头和查询参数来拆分特定清单类型或用户,从而将细分受众群的请求拆分到其他来源。
以下示例展示了如何将与主机 media.example.com
的特定标头、查询参数和路径前缀匹配的请求路由到相应位置:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 10 origin: staging-live-origin matchRules: - prefixMatch: /vod/ headerMatches: - headerName: "x-staging-client" presentMatch: true queryParameterMatches: - name: "live" exactMatch: "yes" routeAction: cdnPolicy: defaultTtl: 5s
路径匹配
媒体 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
的请求与此路由不匹配。
在第二种情况下,除非配置了其他路由或通用路由,否则媒体 CDN 会返回 HTTP 404
错误。
如需有关具有相似前缀的路由的优先级规则的指导,请参阅路由优先级和排序部分。
模式(通配符)匹配
借助格式匹配,您可以使用通配符语法来匹配网址的多个部分,包括部分网址和后缀(文件扩展名)。
您还可以在 pathTemplateMatch
字段中将一个或多个路径段与命名变量相关联,然后在 pathTemplateRewrite
字段中重写网址时引用这些变量。这样,您就可以在将请求发送到来源之前对网址片段重新排序和移除。
以下示例展示了如何匹配两个不同的网址后缀:
# EdgeCacheService.routing.pathMatchers[] routeRules: - priority: 1 description: "Match video segments" matchRules: - pathTemplateMatch: "/**.ts" - pathTemplateMatch: "/**.m4s" origin: prod-video-storage
支持的语法包括:
运算符 | Matches | 示例 |
---|---|---|
*
|
匹配单个路径段,包括下一个路径分隔符:/
|
/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(动态广告插播)服务时,以及在清单每隔几秒更新一次的直播视频中,通常会采用这种方法。
以下配置演示了如何配置媒体 CDN 路由以支持此功能:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: # the first route only matches video manifests - priority: 1 matchRules: - pathTemplateMatch: "/**.m3u8" # "**" matches all path segments - pathTemplateMatch: "/**.mpd" origin: manifest-origin routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL defaultTtl: 5s # the second route matches video segments, fetches them # from a separate origin server, caching them for a longer # duration (1 day). - priority: 2 matchRules: - pathTemplateMatch: "/**.ts" - pathTemplateMatch: "/**.m4s" origin: segment-origin routeAction: cdnPolicy: cacheMode: FORCE_CACHE_ALL defaultTtl: 86400s
示例:捕获路径变量
以下示例展示了如何使用命名变量来描述一个或多个路径片段。
这些变量可在 pathTemplateRewrite
中使用,以便在请求发送到来源之前重写路径,或使复杂的 pathTemplateMatch
自描述。
routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 matchRules: # Matches a request of "/us/en/hls/123139139/segments/00001.ts" - pathTemplateMatch: "/{country}/{lang}/{format}/{id}/{file=**}" origin: my-origin routeAction: urlRewrite: # Rewrites to "/123139139/hls/segments/00001.ts" pathTemplateRewrite: "/{id}/{format}/{file}"
具体而言:
- 每个
{name}
变量都会捕获单个路径段。路径段是指网址路径中一对/
(“斜线”)之间的所有字符。 {name=**}
变量会捕获所有剩余的路径段;在本例中,它与segments/00001.ts
和master.m3u8
都匹配。- 在同一路线上的
pathTemplateRewrite
中,您可以引用在pathTemplateMatch
中捕获的部分变量。您明确省略了{country}
和{lang}
变量,因为它们与源代码中的目录结构不匹配。
在本示例中,会发生以下情况:
- 传入请求网址
/us/en/hls/123139139/segment_00001.ts
与pathTemplateMatch
匹配,并在发送到来源之前重写为/123139139/hls/segment_00001.ts
。 - 传入请求网址
/us/123139139/master.m3u8
与pathTemplateMatch
不匹配,并收到 HTTP404 (Not Found)
响应。 - 传入请求网址
/br/es/dash/c966cbbe6ae3/subtitle_00001.vtt
也与pathTemplateMatch
匹配,并会在发送到来源之前重写为/c966cbbe6ae3/dash/subtitle_00001.vtt
。
如需详细了解通配符匹配如何与网址重写互操作,请参阅重写部分。
主机匹配
每个服务都可以与多个主机名匹配,每组主机名都包含自己的路由组(称为路径匹配器)。在最常见的情况下,服务的所有主机名都会映射到一组共享路由,其中包含单个主机列表和单个路径匹配器。
name: prod-service routing: hostRules: - hosts: - media.example.com - *.vod.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: # list of routes for the configured hosts - priority: 999 matchRules: - prefixMatch: / origin: DEFAULT_ORIGIN
系统会向不匹配的主机提供默认的 HTTP 404
网页。如需接受任何主机,您可以将通配符 *
作为 hostRules[].hosts[]
条目添加。
您还可以定义路线组(例如,按国家/地区或直播与点播进行分组)。由于每项服务都有单独的安全政策,因此我们通常建议为每个市场(地理位置)或工作负载创建一项服务。
注意:
- 包含端口的主机(或 HTTP/2
:authority
)标头会隐式与配置的主机进行匹配。您无需明确指定端口。 - 如果请求是通过 HTTP 发出的,
*.vod.example.com
的hostRules[].hosts[]
条目与us.vod.example.com
和us.vod.example.com:80
匹配。 - 如果请求是通过 HTTPS (TLS) 发出的,
*.vod.example.com
的hostRules[].hosts[]
条目与us.vod.example.com:443
匹配。
如需了解详情,请参阅 HostRule
的 API 规范。
匹配标头和查询参数
您可以配置路由,以便根据特定标头和查询参数名称以及标头值的存在情况(前缀、后缀或完全匹配)进行匹配。
查询参数和标头匹配是逻辑“AND”运算 - 请求必须与所有查询参数和标头键(以及值,如果已指定)匹配,才能与给定路由匹配。
例如,如果您想将具有特定标头字段名称和标头值的请求路由到名为 alternate-origin
的来源,请在 routeRules[].matchRules[].headerMatches[]
中配置匹配条件:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: alternate-origin matchRules: - prefixMatch: "/videos/" headerMatches: - headerName: "x-device-name" exactMatch: "roku"
在此示例中,网址开头包含 /videos/
且包含 x-device-name: roku
标头的请求与此路由匹配。缺少此标头名称或使用其他值的请求与此路由不匹配。
如需了解详情,请参阅 HeaderMatch
的 API 规范。
同样,如需与查询参数进行匹配,请按如下方式指定一个或多个 queryParameterMatches
:
name: prod-service routing: hostRules: - hosts: - media.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: eu-live-origin-prod matchRules: - prefixMatch: "/videos/" queryParameterMatches: - name: "playback_type" exactMatch: "live" - name: "geo" exactMatch: "eu"
在此示例中,https://cdn.example.com/videos/1234/abcd/xyz.m3u8?playback_type=live&geo=eu
的客户端请求与此路由匹配。
如需了解详情,请参阅 QueryParameterMatcher
的 API 规范。
定义一个万能网址(默认)路由
默认情况下,如果请求与任何已配置的路由都不匹配,媒体 CDN 会返回 HTTP 404 (Not Found)
错误。
如需为给定 pathMatcher
(路线集合)配置 catch-all 路线,请执行以下操作:
- 创建优先级最低(数字最高)的
routeRule
,例如 999,这是可能的最低路由优先级。 - 配置前缀匹配为
/
(匹配所有请求路径)的matchRule
。 - 在路线上配置
origin
或urlRedirect
(任一者)。
例如,如需配置将所有不匹配的请求定向到名为 my-origin
的默认来源的通用路由,请创建一条具有 priority: 999
和 matchRules[].prefixMatch
(值为 /
)的新路由,如下所示:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 999 origin: my-origin matchRules: - prefixMatch: /
您可以选择在提取来源之前重写网址,也可以重定向到默认页面(例如着陆页),而不是将请求“原样”发送到来源。
路由优先级和排序
routeRules[]
数组中的每个路线都必须有一个关联的 priority
。
更具体的路由应设置为更高的优先级(数字越小)。否则,优先级为 1 且与前缀 /stream/
匹配的路由会阻止优先级为 5 且更具体的路由 /stream/live/eu/
与任何请求匹配。
- 优先级最高的路由为“1”,最低的路由为“999”。
- 您不能配置两条或更多具有相同优先级的 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 仅会将 GET
、HEAD
和 OPTIONS
方法代理到您的源,并滤除可修改源的方法。
您可以通过指定要代理到源的请求方法,为特定路由规则替换此默认行为。除了 GET
、HEAD
和 OPTIONS
之外,媒体 CDN 还支持 PUT
、POST
、DELETE
和 PATCH
。
如需为路由规则配置对一组方法的支持,请指定一个 routeMethods
部分,其中包含每个方法的 allowed_methods
值。
routeRules: - priority: 5 description: "Video uploads" routeMethods: allowedMethods: ["PUT", "POST", "OPTIONS"] matchRules: - pathTemplateMatch: "/uploads/**.ts" origin: prod-video-storage - priority: 10 description: "Video serving" routeMethods: allowedMethods: ["GET", "HEAD"] matchRules: - pathTemplateMatch: "/videos/**.ts" origin: prod-video-storage
路径规范化
路径标准化介绍了 Media CDN 如何在特定情况下将网址的多个表示形式合并为单个规范表示形式。
路径规范化可以通过减少表示相同内容的请求网址数量,以及减少预期使用规范化路径的源站出现的源站错误,直接提高缓存命中率。
系统会根据以下规则对传入请求进行标准化处理:
- 多个连续斜杠会合并为单个斜杠。例如,网址路径
/videos///12345/manifest.mpd
会规范化为/videos/12345/manifest.mpd
。 - 路径片段会根据 RFC 3986 第 6.2.2.3 节进行规范化。例如,路径
/a/b/c/./../../g
会根据 RFC 3986 中定义的“移除点段”算法标准化为/a/g
。此规范化会在检查缓存或将请求转发到源之前进行。 - 请求未进行百分比编码。例如,采用百分号编码的斜杠字符 (
%2F
) 的网址不会解码为未编码的形式。
网址仍然区分大小写,不会进行大小写规范化处理。许多网址都包含区分大小写的 Base64 编码,包括包含已签名请求令牌的网址。
重写和重定向
以下部分提供了有关如何重写请求和配置重定向的示例。
重写请求网址
Media CDN 支持主机和路径重写。重写会更改发送到源的网址,并允许您根据需要修改主机和路径。主机和路径重写位于路由级别,可让您根据任何匹配器(包括路径、查询参数和请求标头)定义要重写的具体请求。
如需了解详情,请参阅 RouteAction.UrlRewrite
的 API 规范。
以下是重写请求的三种方式:
字段 | 说明 |
---|---|
urlRewrite.pathPrefixRewrite
|
重写路径,移除与请求匹配的
在单个路线规则中,只能指定 |
urlRewrite.pathTemplateRewrite
|
在单个路线规则中,只能指定 |
urlRewrite.hostRewrite
|
在将请求发送到源服务器之前重写主机。 |
注意:
- 重写的网址不会更改缓存键。缓存键基于客户端发送的请求网址。
- 重写会在路由匹配和已签名请求验证之后进行。系统不会针对其他匹配规则重新匹配路线。
示例:移除路径前缀
例如,如需将客户端请求网址从 /vod/videos/hls/1234/abc.ts
重写为 /videos/hls/1234/abc.ts
(从路径中移除 /vod
),您可以使用 pathPrefixRewrite
功能:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: my-origin matchRules: - prefixMatch: "/vod/videos/" routeAction: urlRewrite: pathPrefixRewrite: "/videos/"
pathPrefixRewrite
的运作方式是将 matchRules[].prefixMatch
中匹配到的整个路径前缀替换为 pathPrefixRewrite
的值。
如需重写主机名(例如,将 cdn.example.com
重写为 my-bucket.s3.us-west-2.amazonaws.com
),您可以配置以下内容:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 1 origin: my-origin matchRules: - prefixMatch: "/videos/" routeAction: urlRewrite: hostRewrite: "my-bucket.s3.us-west-2.amazonaws.com"
在这种情况下,来源请求网址将从 cdn.example.com/videos/*
更改为 my-bucket.s3.us-west-2.amazonaws.com/videos/*
。您还可以在单个路线中组合使用主机重写和路径重写。
示例:使用变量重写网址
如需使用 pathTemplateMatch
和 pathTemplateRewrite
重写传入请求网址的部分内容,请参阅捕获变量部分。
重定向请求
Media CDN 支持三种类型的重定向:
- 主机重定向,仅重定向主机(网域),路径和查询参数保持不变。
- 路径重定向,用于完全替换路径。
- 路径前缀重定向,仅替换匹配的前缀。
重定向默认为 HTTP 301 (Moved Permanently)
,但可以配置为按路由返回不同的重定向状态代码。
以下配置是基于前缀的重定向示例,您可以将访问 https://cdn.example.com/on-demand/*
的用户重定向到 https://cdn.example.com/streaming/*
。
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 10 matchRules: - prefixMatch: "/on-demand/" urlRedirect: # The prefix matched in matchRules.prefixMatch is replaced # by this value prefixRedirect: "/streaming/" redirectResponseCode: TEMPORARY_REDIRECT # corresponds to a HTTP 307
此示例还将重定向更改为临时重定向,以防止客户端(例如浏览器)对其进行缓存。如果您预计近期会更改此值,则此操作会很有用。
下表显示了支持的 redirectResponseCode
值。
重定向响应代码 | HTTP 状态代码 |
---|---|
MOVED_PERMANENTLY_DEFAULT |
HTTP 301(已永久移动) |
FOUND |
HTTP 302(已找到) |
SEE_OTHER |
HTTP 303(查看其他选项) |
TEMPORARY_REDIRECT |
HTTP 307(临时重定向) |
PERMANENT_REDIRECT |
HTTP 308(永久重定向) |
注意:
- 路线可以将流量引导至来源,也可以向客户端返回重定向。您不能同时设置
origin
和urlRedirect
字段。 - 重定向到 HTTPS 的路线需要将至少一个 SSL 证书附加到服务。
如需了解详情,请参阅 RouteRule.UrlRedirect
的 API 规范。
将所有请求重定向到 HTTPS
如需将所有请求重定向到 HTTPS(而非 HTTP),您可以将每项服务配置为自动将所有客户端请求重定向到 HTTPS。系统会向通过 HTTP 连接的客户端发送 HTTP 301 (Permanent Redirect)
响应,并使用“https://”而非“http://”将 Location
标头设置为同一网址。
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 和其他存储空间提供商。如果您采用的是多云架构,或者尚未使用 Storage Transfer Service 将数据迁移到 Cloud Storage,这项功能会很有用。
在 AWS S3 中配置虚拟主机存储桶的最小源配置:
name: MY_S3_ORIGIN originAddress: BUCKET-NAME.s3.REGION.amazonaws.com
如果您使用的存储桶名称与为 EdgeCacheService
资源配置的主机名不匹配,则还必须为与此源(或来源)关联的路由配置主机重写。否则,从源提取时,系统会使用由客户端请求设置的主机标头。
例如,若要将路径前缀为 /legacy/
的所有请求映射到外部存储桶,您可以同时配置 hostRewrite
和 pathPrefixRewrite
以从来源请求中剥离此前缀:
routeRules: - description: legacy backend matchRules: - prefixMatch: "/legacy/" routeAction: urlRewrite: hostRewrite: BUCKET-NAME.s3.REGION.amazonaws.com pathPrefixRewrite: / cdnPolicy: cacheMode: CACHE_ALL_STATIC defaultTtl: 3600s
如需详细了解如何在源请求上设置主机标头,请参阅源请求标头文档。
跨源资源共享 (CORS)
跨源资源共享 (CORS) 是一种以浏览器为中心的方法,可安全地发出跨源请求。借助 CORS 政策,您可以根据每个路由的政策自动设置 CORS 标头,例如 Access-Control-Allow-Origins
。
配置 CORS
借助 Media CDN,您可以为 EdgeCacheService
的路由定义 CORS 政策。
CORS 政策使用一组常见的 HTTP 标头定义这些规则。您可以在响应中设置常见的 CORS 标头,例如 Access-Control-Allow-Origin
、Access-Control-Max-Age
和 Access-Control-Allow-Headers
。借助这些标头,您可以对 Media CDN 服务进行跨源调用,这些服务可能托管在与您网站前端不同的网域(来源)上,并且可能会阻止您未明确允许的跨源请求。
例如,player.example.com
和 api.example.com
是不同的来源(在浏览器意义上),您可能希望让前端应用向 api.example.com
发出请求,以提取下一个播放列表或刷新相关内容的列表。同样,player.example.com
可能需要与 cdn.example.com
联系以提取视频播放列表和视频片段:cdn.example.com
需要指明这样做没问题,player.example.com
是 allowed origin
,以及任何其他规则(允许的标头、是否可以包含 Cookie)。
再举一个例子,如果您想允许在 CORS 请求中将 stream.example.com
用作来源和 X-Client-ID
标头,则可以对路线配置 corsPolicy
,如下所示:
corsPolicy: maxAge: 600 allowOrigins: ["stream.example.com"] allowHeaders: ["X-Client-ID"]
在 EdgeCacheService 内的 routing.pathMatchers[].routeRules[].routeAction.corsPolicy
处配置 corsPolicy
。每个 routeRule
都可以根据需要定义不同的 corsPolicy
,也可以不定义 corsPolicy
。
如果您定义了 corsPolicy
值,并且还在名称相同的路由上使用 responseHeadersToAdd
字段设置了自定义响应标头,则自定义响应标头优先于 corsPolicy
值,并会取代 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 |
设置 某些浏览器会将此值限制为 2 小时或更短时间,即使指定了最大值 (86400 秒) 也是如此。 |
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) 证书。
- 配置已签名请求,以对内容访问权限进行身份验证。