Media CDN proporciona capacidades avanzadas de enrutamiento HTTP que te permiten asignar tráfico a configuraciones y orígenes perimetrales específicos a nivel detallado.
Configura una regla de ruta
Configura una regla de enrutamiento para un servicio de Media CDN.
Console
En la consola de Google Cloud, ve a la página Media CDN.
Para abrir la página Detalles del servicio para el que deseas configurar una regla de ruta, haz clic en el nombre del servicio.
Para cambiar al modo de edición, haz clic en el botón Editar.
Para navegar a la sección Enrutamiento, haz clic en Siguiente.
Especifica al menos una regla de host. Haz clic en Agregar regla de host. Luego, haz lo siguiente: lo siguiente:
En Hosts, especifica al menos un host para la coincidencia.
En Descripción, proporciona una descripción breve de la regla de host.
Como alternativa, para editar una regla de host, haz clic en la flecha para expandirla.
Especifica al menos una regla de enrutamiento. Haz clic en Add route rule.
Como alternativa, para editar una regla de ruta, haz clic en
Editar en la fila correspondiente.En el panel Editar regla de enrutamiento, en Prioridad, establece un valor para prioridad de la ruta.
En Descripción, proporciona una descripción breve que pueda ayudar a identificar la regla en una lista de reglas.
En la sección Coincidencia, especifica al menos una condición de coincidencia. Haz clic en Agrega una condición de coincidencia. A continuación, sigue estos pasos:
- En Tipo de concordancia, selecciona cualquier opción de coincidencia de ruta.
Para Coincidencia de ruta, especifica los nombres, las rutas de acceso o las plantillas. Considera usar la coincidencia de patrones con comodines.
Si es necesario, también selecciona Habilitar la distinción entre mayúsculas y minúsculas para el valor de la ruta de acceso.
Opcional: Selecciona Coincidencia de encabezados y Coincidencia de parámetros de consulta. Luego, haz clic en los botones correspondientes para agregar encabezados y parámetros de consulta. Para cada uno, especifica el nombre, el tipo de concordancia y el valor.
Para obtener más información, consulta Coincidencia en encabezados y parámetros de consulta.
Para guardar la condición de coincidencia, haz clic en Listo.
En Acción principal, selecciona una de las siguientes opciones:
Recuperar desde un origen: Para dirigir solicitudes a un origen específico, selecciona esta opción y, luego, un origen.
Redireccionamiento de URL: Para redireccionar solicitudes, selecciona esta opción. Luego, especifica el tipo de redireccionamiento, la ruta de acceso y el código de estado.
De forma opcional, selecciona las opciones para redireccionar todas las respuestas a HTTPS o para quitar la consulta.
Haz clic en Configuración avanzada.
En la sección Acción del encabezado, haz clic en Agregar un elemento.
Selecciona un tipo de acción y, luego, especifica un encabezado como un par de nombre y valor. Luego, haz clic en Listo.
En la sección Acción de ruta, haz clic en Agregar un elemento.
Especifica un tipo de acción y sus opciones relacionadas. Luego, haz clic en Listo.
En Filtrado de métodos HTTP, selecciona Personalizar el filtrado de métodos HTTP.
Luego, selecciona los métodos HTTP que quieres que se dirija a tu origen.
Para guardar la regla de enrutamiento, haz clic en Guardar.
Para guardar los cambios en el servicio, haz clic en Actualizar servicio.
gcloud y YAML
Exporta la configuración de la CDN de Media a un archivo YAML. Usa el comando
gcloud edge-cache services export
.gcloud edge-cache services export SERVICE_NAME \ --destination=FILENAME.yaml
Reemplaza lo siguiente:
SERVICE_NAME
: el nombre de tu servicio.FILENAME
: Es el nombre de tu archivo YAML.
Actualiza el archivo YAML con la configuración requerida, como se describe en las secciones de esta página.
Para actualizar el servicio, importa la configuración de Media CDN. del archivo YAML. Usa el comando
gcloud edge-cache services import
.gcloud edge-cache services import SERVICE_NAME \ --source=FILENAME.yaml
Solicitudes coincidentes
Una configuración de Media CDN contiene un conjunto de rutas definidas en la sección Enrutamiento para un recurso EdgeCacheService
.
Estas rutas coinciden con las solicitudes en función de (al menos) un host. Para obtener más detalles sobre cómo se dirige el tráfico a un origen, consulta HostRule
y PathMatcher
.
Cada ruta puede definir su propia configuración de CDN, reescrituras, redireccionamientos, políticas de CORS, encabezados HTTP personalizados y asignación de origen.
Las rutas pueden compartir orígenes.
Por ejemplo, puedes enrutar las solicitudes de manifiestos a un origen específico y definir un TTL de caché de corta duración y una política de almacenamiento en caché negativo. Las solicitudes de segmentos se pueden dividir en otro origen mediante el uso de encabezados y parámetros de consulta para desglosar tipos de manifiestos o usuarios específicos.
En el siguiente ejemplo, se muestra cómo enrutar las solicitudes que coinciden con un encabezado específico.
parámetro de consulta y prefijo de ruta de acceso para el 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
Coincidencia de ruta
Media CDN admite la coincidencia de rutas de acceso completas (exactas), de prefijos y de comodines. La coincidencia de rutas de acceso se puede combinar con la coincidencia basada en el host, el encabezado y el parámetro de consulta para crear reglas de enrutamiento de solicitudes detalladas.
A continuación, se incluyen tres formas de hacer coincidir una ruta de URL.
Campo | Descripción | Ejemplo |
---|---|---|
matchRules[].fullPathMatch
|
La condición fullPathMatch coincide con la ruta de URL completa, que no incluye la cadena de consulta. Debes especificar la actividad
o barras diagonales, si es relevante.
|
Una ruta con una regla de coincidencia de Un |
matchRules[].prefixMatch
|
La condición prefixMatch coincide con el prefijo de la ruta de URL, las URLs que empiezan por la misma cadena coinciden.
|
Una ruta con una regla de coincidencia de |
matchRules[].pathTemplateMatch
|
La condición pathTemplateMatch admite
comodines, lo que te permite hacer coincidir patrones de URL y rutas complejas
segmentos, y capturan variables con nombre para reescribir las URLs.
|
Una ruta con una regla de coincidencia de
Tanto Para ver más ejemplos, consulta la sección Coincidencia de patrones. |
Para obtener más detalles, consulta la especificación de la API de MatchRule
.
Por ejemplo, para que coincidan todas las solicitudes que comienzan con /stream/
, crea una regla de enrutamiento
similar al siguiente:
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/
En este ejemplo, se incluye explícitamente la barra final en la regla de coincidencia:
- Una solicitud a
media.example.com/stream/id/1234/hls/manifest.m3u8
coincide con esta ruta. - Una solicitud a
media.example.com/stream-eu/id/4567/hls/manifest.m3u8
no coincide con esta ruta.
En el segundo caso, Media CDN muestra un error HTTP 404
, a menos que haya otra ruta o una ruta de captura configurada.
Si deseas obtener orientación sobre el funcionamiento de la predecencia para las rutas con prefijos similares, consulta la sección de prioridad y orden de la ruta.
Coincidencia de patrón (comodín)
La coincidencia de patrones te permite hacer coincidir varias partes de una URL, incluidas las URL parciales. y sufijos (extensiones de archivo), con la sintaxis de comodines.
También puedes asociar uno o más componentes de ruta de acceso con variables con nombre en un campo pathTemplateMatch
y, luego, hacer referencia a esas variables cuando reescribes la URL en un campo pathTemplateRewrite
. Esto te permite reordenar y quitar los componentes de la URL antes de enviar la solicitud a tu origen.
En el siguiente ejemplo, se muestra cómo puedes establecer coincidencias con dos sufijos de URL diferentes:
# EdgeCacheService.routing.pathMatchers[] routeRules: - priority: 1 description: "Match video segments" matchRules: - pathTemplateMatch: "/**.ts" - pathTemplateMatch: "/**.m4s" origin: prod-video-storage
La sintaxis compatible incluye lo siguiente:
Operador | Coinciden | Ejemplo |
---|---|---|
*
|
Coincide con un solo componente de ruta, hasta el siguiente separador de ruta: / .
|
/videos/*/*/*.m4s coincide con
/videos/123414/hls/1080p5000_00001.m4s .
|
**
|
Coincide con cero o más segmentos de ruta. Si está presente, debe ser el último operador. |
/**.mpd coincide con
/content/123/india/dash/55/manifest.mpd .
|
{name} or {name=*}
|
Una variable con nombre que coincide con un segmento de ruta de acceso.
Coincide con un solo componente de ruta, hasta el siguiente separador de ruta:
|
/content/{format}/{lang}/{id}/{file}.vtt coincidencias
/content/hls/en-us/12345/en_193913.vtt y capturas
format="hls" , lang="en-us" y id="12345"
y file="en_193913" como variables.
|
{name=videos/*}
|
Una variable con nombre que coincide con más de un segmento de ruta de acceso. El componente de la ruta
que coinciden con videos/* como la variable con nombre.
|
/videos/{language=lang/*}/* coincide con /videos/lang/en/video.m4s y completa la variable de ruta de acceso language con el valor lang/en .
|
{name=**}
|
Una variable con nombre que coincide con cero o más segmentos de ruta de acceso. Si está presente, debe ser el último operador. |
|
Notas:
- Si no vas a reescribir una URL, usa los operadores
*
y**
más simples. - Cuando se usan variables para capturar componentes de ruta de acceso, no se puede hacer referencia a las partes de la URL que no captura una variable en un
pathTemplateRewrite
posterior. Para ver un ejemplo, consulta la sección Captura de variables de ruta. - No puedes hacer referencia a variables en un
pathTemplateRewrite
posterior que no están en elpathTemplateMatch
de la misma ruta. - Las variables distinguen mayúsculas de minúsculas, y
{FORMAT}
,{forMAT}
y{format}
representan diferentes variables y valores. - Puedes especificar hasta 10 operadores (como comodines o variables) en una concordancia.
Los campos
pathTemplateMatch
ypathTemplateRewrite
no deben exceder los 255 caracteres.
Ejemplo: coincidencia en una extensión de archivo
En el siguiente ejemplo, se muestra un caso de uso común para los operadores de comodín: coincidencias todos los componentes de la ruta de acceso hasta un sufijo.
En este caso, haz lo siguiente:
- Recupera manifiestos de video (playlists) que terminan en
.m3u8
y.mpd
desde el origen del manifiesto y aplica un TTL corto (5 segundos) a estas respuestas porque cambian con frecuencia. - Recuperar los segmentos de video que terminan en
.ts
y.m4s
a partir del origen del segmento aplica un TTL más largo (1 día) a estas respuestas.
Este enfoque a menudo se usa cuando se usan servicios SSAI (inserción de anuncios del servidor) o DAI (inserción de anuncios dinámicos) y videos en vivo en los que el manifiesto se actualiza cada pocos segundos.
En la siguiente configuración, se muestra cómo configurar el enrutamiento de Media CDN para admitir esto:
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
Ejemplo: captura de variables de ruta
En el siguiente ejemplo, se muestra cómo usar variables con nombre para describir uno o más de la ruta de acceso.
Estas variables se pueden usar en un pathTemplateRewrite
para reescribir la ruta de acceso antes de que se envíe la solicitud al origen o para hacer que un pathTemplateMatch
complejo se autodescriba.
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}"
En particular, haz lo siguiente:
- Cada variable
{name}
captura un solo segmento de ruta de acceso. Un segmento de ruta son todos los caracteres entre un par de/
(“diagonal”) en una ruta de URL. - Una variable de
{name=**}
captura todos los segmentos de ruta restantes; en este caso, coincide consegments/00001.ts
ymaster.m3u8
. - En el
pathTemplateRewrite
en la misma ruta, puedes hacer referencia a algunas de las variables que capturaste en elpathTemplateMatch
. Omites de forma explícita las variables{country}
y{lang}
porque no coinciden con la estructura de directorios del origen.
Con este ejemplo, ocurre lo siguiente:
- Una URL de solicitud entrante de
/us/en/hls/123139139/segment_00001.ts
coincide conpathTemplateMatch
y se reescribe a/123139139/hls/segment_00001.ts
antes de enviarse al origen. - Una URL de solicitud entrante de
/us/123139139/master.m3u8
no coincide conpathTemplateMatch
y recibe una respuesta HTTP404 (Not Found)
. - Una URL de solicitud entrante de
/br/es/dash/c966cbbe6ae3/subtitle_00001.vtt
también coincide conpathTemplateMatch
y se vuelve a escribir en/c966cbbe6ae3/dash/subtitle_00001.vtt
antes de enviarse al origen.
Para obtener más información sobre cómo funciona la coincidencia de comodines con la reescritura de URL, consulta la sección rewrites.
Coincidencia de host
Cada servicio puede coincidir con varios nombres de host, y cada conjunto de nombres de host contiene su propio grupo de rutas (conocidas como comparadores de rutas de acceso). En el caso más común, todos los nombres de host de un servicio se asignan a un único conjunto de rutas compartidas con un único de hosts y un único comparador de rutas de acceso.
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
A los hosts que no coinciden se les entrega una página HTTP 404
predeterminada. Para aceptar cualquier host,
puedes incluir el carácter comodín *
como una entrada hostRules[].hosts[]
.
También puedes definir grupos de rutas (por ejemplo, agrupar por país o tiempo real) y a pedido). Debido a que cada servicio tiene una sola política de seguridad, por lo general, recomendamos tener un servicio para cada mercado (geografía) o carga de trabajo que tengas.
Notas:
- Los encabezados de host (o HTTP/2
:authority
) que contienen un puerto se para compararlo con un host configurado. No es necesario que especifiques los puertos de forma explícita. - Si la solicitud es a través de HTTP, una entrada
hostRules[].hosts[]
de*.vod.example.com
coincide conus.vod.example.com
yus.vod.example.com:80
- Si la solicitud es a través de HTTPS (TLS), una entrada
hostRules[].hosts[]
de*.vod.example.com
coincide conus.vod.example.com:443
.
Para obtener más detalles, consulta la especificación de la API de HostRule
.
Coincidencia en encabezados y parámetros de consulta
Puedes configurar las rutas para que coincidan con encabezados y nombres de parámetros de consulta específicos. así como la presencia de un valor de encabezado (prefijo, sufijo o concordancia exacta).
La coincidencia de parámetros de consulta y encabezados es un “Y” lógico: la solicitud debe coincidir con todos los parámetros de consulta y claves de encabezado (y valores, si se especifican) para coincidir con la ruta determinada.
Por ejemplo, si quieres enrutar solicitudes con un nombre de campo de encabezado específico y
valor de encabezado a un origen llamado alternate-origin
, configura tu coincidencia
condiciones en 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"
En este ejemplo, las solicitudes con /videos/
al comienzo de la URL y el
El encabezado x-device-name: roku
coincide con esta ruta. Las solicitudes que no tienen este nombre de encabezado o que tienen un valor diferente no coinciden con esta ruta.
Para obtener más detalles, consulta la especificación de la API de HeaderMatch
.
De manera similar, para hacer coincidir los parámetros de consulta, especifica uno o más queryParameterMatches
de la siguiente manera:
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"
En este ejemplo, una solicitud del cliente de
https://cdn.example.com/videos/1234/abcd/xyz.m3u8?playback_type=live&geo=eu
coincide con esta ruta.
Para obtener más información, consulta las especificaciones de la API para
QueryParameterMatcher
Define una ruta de captura (predeterminada)
De forma predeterminada, Media CDN muestra un error HTTP 404 (Not Found)
si una solicitud
no coincide con ninguna de las rutas configuradas.
Para configurar una ruta general, para un pathMatcher
determinado (colección de
rutas), haz lo siguiente:
- Crea un
routeRule
con la prioridad más baja (número más alto), por ejemplo, 999, que es la prioridad de ruta más baja posible. - Configura un
matchRule
con una coincidencia de prefijo de/
(coincide con todas las solicitudes) rutas de acceso). - Configura (uno de) un
origin
ourlRedirect
en la ruta.
Por ejemplo, para configurar una ruta de captura general que dirija todas las solicitudes que no coincidan a un origen predeterminado llamado my-origin
, crea una ruta nueva con priority: 999
y un matchRules[].prefixMatch
de /
de la siguiente manera:
name: prod-service routing: hostRules: - hosts: - cdn.example.com pathMatcher: example_routes pathMatchers: - name: example_routes routeRules: - priority: 999 origin: my-origin matchRules: - prefixMatch: /
De manera opcional, puedes reescribir la URL antes de la recuperación del origen o redireccionar a una página predeterminada (como tu página de destino) en lugar de enviar la solicitud “tal como está” al origen.
Orden y prioridad de ruta
Cada ruta en un array de routeRules[]
debe tener un priority
asociado con
que la modifica.
Las rutas más específicas deben establecerse en una prioridad más alta (número más bajo). De lo contrario, una ruta que coincida con un prefijo de /stream/
con una prioridad de 1 evita que una ruta más específica de /stream/live/eu/
con una prioridad de 5 coincida con ninguna solicitud.
- La ruta de mayor prioridad es "1" y la más baja es "999".
- No puedes configurar dos o más routeRules con la misma prioridad. La prioridad para cada regla debe establecerse en un número entre 1 y 999, inclusive.
- Definir una ruta genérica te permite enviar todas solicitudes que no coinciden a un origen o redireccionamiento predeterminado a una página de destino o extremo.
En el siguiente ejemplo, puedes ver que la ruta /live/us/
nunca coincidiría porque la ruta /live/
tiene una prioridad más alta:
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: /
Para solucionar este problema, debes asignar una prioridad más alta a la ruta más específica (más larga):
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: /
Esto permite que la ruta más específica coincida con las solicitudes correctamente. Una solicitud con el prefijo /live/eu/
seguiría pasando a la ruta /live/
en la prioridad 2.
Filtrado de métodos
De forma predeterminada, Media CDN solo procesa GET
, HEAD
y OPTIONS
.
métodos a tu origen y filtra los métodos que pueden modificar tu origen.
Puedes anular este comportamiento predeterminado para una regla de ruta específica si especificas
los métodos que deseas que se almacenen en proxy en tu origen. Además de GET
, HEAD
y OPTIONS
, Media CDN admite PUT
, POST
, DELETE
y PATCH
.
Para configurar la compatibilidad con un conjunto de métodos para una regla de ruta, especifica una sección routeMethods
que tenga un valor allowed_methods
para cada método.
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
Normalización de rutas
La normalización de la ruta de acceso describe cómo Media CDN combina múltiples de una URL en una única representación canónica bajo requisitos reales.
La normalización de la ruta de acceso puede mejorar directamente las tasas de acierto de caché mediante la reducción del número de URLs de solicitudes que representan el mismo contenido y mitigando los errores de origen para orígenes que esperan rutas normalizadas.
Las solicitudes entrantes se normalizan de acuerdo con lo siguiente:
- Varias barras consecutivas se combinan en una sola. Por ejemplo, un
La ruta de URL de
/videos///12345/manifest.mpd
se normaliza a/videos/12345/manifest.mpd
- Los segmentos de ruta se normalizan de acuerdo con RFC 3986, sección 6.2.2.3.
Por ejemplo, la ruta de acceso
/a/b/c/./../../g
se normaliza a/a/g
según el algoritmo "remove dot segments" definido en RFC 3986. Esta normalización ocurre antes de verificar a la caché o reenviar la solicitud al origen. - Las solicitudes no están normalizadas de codificación porcentual. Por ejemplo, una URL con una URL
el carácter de barra con codificación por ciento (
%2F
) no se decodifica en el campo formulario.
Las URLs distinguen mayúsculas de minúsculas, y no están normalizadas. Muchas URL contienen codificaciones de base64 que distinguen entre mayúsculas y minúsculas, incluidas las URLs con tokens de solicitud firmada.
Reescrituras y redireccionamientos
En las siguientes secciones, se proporcionan ejemplos para reescribir solicitudes y configurar redireccionamientos.
Reescribe las URLs de solicitud
Media CDN admite reescrituras de host y de ruta de acceso. Las reescrituras cambian la URL que se envía al origen y te permiten modificar los hosts y las rutas de acceso según sea necesario. Las reescrituras de host y ruta de acceso se encuentran a nivel de la ruta, lo que te permite definir qué solicitudes específicas se reescriben en función de cualquier comparador, incluidos la ruta de acceso, el parámetro de consulta y el encabezado de la solicitud.
Para obtener más información, consulta las especificaciones de la API para
RouteAction.UrlRewrite
A continuación, se muestran tres formas de reescribir una solicitud:
Campo | Descripción |
---|---|
urlRewrite.pathPrefixRewrite
|
Vuelve a escribir la ruta de acceso y quita el prefijo especificado en el
Solo una de las siguientes opciones: |
urlRewrite.pathTemplateRewrite
|
Solo se puede especificar una de |
urlRewrite.hostRewrite
|
Vuelve a escribir el host antes de que se envíe la solicitud al servidor de origen. |
Notas:
- Las URLs reescritas no cambian la clave de caché. La clave de caché se basa en lo siguiente: la URL de la solicitud que envió el cliente.
- La reescritura ocurre después de la coincidencia de ruta y la validación de la solicitud firmada. Las rutas no se vuelven a hacer coincidir con otra regla de coincidencia.
Ejemplo: quita un prefijo de ruta de acceso
Por ejemplo, para volver a escribir la URL de solicitud del cliente de /vod/videos/hls/1234/abc.ts
a /videos/hls/1234/abc.ts
(quitar /vod
de la ruta), puedes usar la función 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/"
Un pathPrefixRewrite
funciona reemplazando todo el componente de ruta que coincide en matchRules[].prefixMatch
con el valor de pathPrefixRewrite
.
Para volver a escribir un nombre de host (por ejemplo, reescribir cdn.example.com
en
my-bucket.s3.us-west-2.amazonaws.com
), puedes configurar lo siguiente:
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"
En este caso, la URL de solicitud de origen cambiaría de cdn.example.com/videos/*
a my-bucket.s3.us-west-2.amazonaws.com/videos/*
.
También puedes combinar la reescritura de host y de ruta de acceso en una sola ruta.
Ejemplo: usa variables para reescribir URLs
Si deseas usar pathTemplateMatch
y pathTemplateRewrite
para reescribir partes de un
URL de solicitud entrante, consulta la documentación sobre cómo capturar variables
sección.
Solicitudes de redireccionamiento
Media CDN admite tres tipos de redireccionamientos:
- Redireccionamientos de host, que redireccionan solo al host (dominio), manteniendo la ruta de acceso y parámetros de consulta sin cambios.
- Redireccionamientos de ruta de acceso, que reemplazan la ruta por completo.
- Redireccionamientos de prefijo de ruta de acceso, que solo reemplazan el prefijo coincidente.
Los redireccionamientos se establecen de forma predeterminada en HTTP 301 (Moved Permanently)
, pero se pueden configurar para que muestren diferentes códigos de estado de redireccionamiento por ruta.
La siguiente configuración es un ejemplo de un redireccionamiento basado en prefijos, en el que redireccionas a los usuarios que visitan https://cdn.example.com/on-demand/*
a 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
Este ejemplo también cambia el redireccionamiento a un redireccionamiento temporal que evita clientes (como navegadores) para que no lo almacenen en caché. Esto puede ser útil si esperas cambiarlo en un futuro cercano.
Los valores redirectResponseCode
admitidos se muestran en la siguiente tabla.
Código de respuesta de redireccionamiento | Código de estado HTTP |
---|---|
MOVED_PERMANENTLY_DEFAULT |
HTTP 301 (Movido permanentemente) |
FOUND |
HTTP 302 (encontrado) |
SEE_OTHER |
HTTP 303 (Ver otro) |
TEMPORARY_REDIRECT |
HTTP 307 (redireccionamiento temporal) |
PERMANENT_REDIRECT |
HTTP 308 (redireccionamiento permanente) |
Notas:
- Una ruta puede dirigir el tráfico a un origen o devolver un redireccionamiento a la
cliente. No puedes configurar los campos
origin
yurlRedirect
al mismo tiempo. - Las rutas que redireccionan a HTTPS requieren que se adjunte al servicio al menos un certificado SSL.
Para obtener más información, consulta las especificaciones de la API para
RouteRule.UrlRedirect
Redireccionar todas las solicitudes a HTTPS
Para redireccionar todas las solicitudes a HTTPS (en lugar de HTTP), puedes configurar cada
tus servicios para redireccionar automáticamente todas las solicitudes de clientes a HTTPS. A los clientes que se conectan a través de HTTP se les envía una respuesta HTTP 301 (Permanent Redirect)
con el encabezado Location
configurado en la misma URL con “https://” en lugar de “http://”.
gcloud
gcloud edge-cache services update MY_SERVICE \ --require-tls
Request issued for: [MY_SERVICE] Updated service [MY_SERVICE].
El comando muestra una descripción de tu servicio, con requireTls
configurado ahora como true
.
name: MY_SERVICE requireTls: true
También puedes establecer la Seguridad de transporte estricta como un encabezado de respuesta para indicar a los clientes que siempre se conecten directamente a través de HTTPS
Usa backends de almacenamiento de terceros
La CDN de medios admite la conexión a extremos HTTP accesibles de forma pública fuera de Google Cloud, incluidos los buckets de almacenamiento de AWS S3, Azure Blob Storage y otros proveedores de almacenamiento. Esto puede ser útil si tienes un arquitectura de múltiples nubes o que aún no migraron datos a Cloud Storage Usa el Servicio de transferencia de almacenamiento.
Una configuración de origen mínima que configura un bucket alojado de forma virtual en AWS S3:
name: MY_S3_ORIGIN originAddress: BUCKET-NAME.s3.REGION.amazonaws.com
Si no usas un nombre de bucket que coincida con los nombres de host configurados para tus recursos de EdgeCacheService
, también debes configurar una reescritura de host para las rutas asociadas con este origen (o orígenes). De lo contrario, se usa el encabezado Host que establece la solicitud del cliente cuando se recupera desde el origen.
Por ejemplo, para asignar todas las solicitudes con un prefijo de ruta de acceso de /legacy/
a tu
bucket externo, puedes configurar un hostRewrite
y un
pathPrefixRewrite
para quitar este prefijo de la solicitud de origen:
routeRules: - description: legacy backend matchRules: - prefixMatch: "/legacy/" routeAction: urlRewrite: hostRewrite: BUCKET-NAME.s3.REGION.amazonaws.com pathPrefixRewrite: / cdnPolicy: cacheMode: CACHE_ALL_STATIC defaultTtl: 3600s
Para obtener más información sobre cómo se configura el encabezado del host en las solicitudes de origen, consulta los encabezados de la solicitud de origen en la documentación de Google Cloud.
Uso compartido de recursos entre dominios (CORS)
Uso compartido de recursos entre dominios
(CORS) es un enfoque centrado en el navegador para realizar solicitudes de origen cruzado de forma segura.
Las políticas de CORS te permiten establecer automáticamente los encabezados de CORS, como
Access-Control-Allow-Origins
, según una política por ruta.
Configurar CORS
Media CDN te permite definir una política de CORS en una ruta para un
EdgeCacheService
Una política de CORS define estas reglas con un conjunto común de encabezados HTTP. Puedes
establece encabezados de CORS comunes en las respuestas, como
Access-Control-Allow-Origin
, Access-Control-Max-Age
,
y Access-Control-Allow-Headers
. Estos encabezados te permiten realizar llamadas entre orígenes a tus servicios de Media CDN que pueden alojarse en un dominio (origen) diferente del frontend de tu sitio web y pueden evitar las solicitudes entre orígenes que no permites de forma explícita.
Por ejemplo, player.example.com
y api.example.com
son orígenes diferentes
(en el sentido del navegador), y es posible que quieras tener tu aplicación de frontend
realiza solicitudes a api.example.com
para recuperar la siguiente playlist o actualiza una
de contenido relacionado. De manera similar, es posible que player.example.com
necesite
Comunícate con cdn.example.com
para recuperar playlists y segmentos de videos:
cdn.example.com
debe indicar que está bien y que
player.example.com
es allowed origin
, así como cualquier otra regla.
(encabezados permitidos, si se pueden incluir cookies).
Para dar otro ejemplo, si quieres permitir stream.example.com
como origen,
y un encabezado X-Client-ID
en las solicitudes de CORS, puedes configurar un corsPolicy
en un
ruta, de la siguiente manera:
corsPolicy: maxAge: 600 allowOrigins: ["stream.example.com"] allowHeaders: ["X-Client-ID"]
Se configura un corsPolicy
en routing.pathMatchers[].routeRules[].routeAction.corsPolicy
dentro de un EdgeCacheService. Cada routeRule
puede definir un corsPolicy
diferente según sea necesario o no definir ninguno.
Si defines un valor corsPolicy
y, además, configuras un encabezado de respuesta personalizado,
Si usas los campos responseHeadersToAdd
de una ruta con el mismo nombre,
el encabezado de respuesta personalizado tiene prioridad sobre el encabezado
Valor corsPolicy
.
Si la respuesta de origen establece encabezados HTTP y tienes un valor corsPolicy
establecido, se usarán los valores de corsPolicy
en su lugar. Los valores no se contraen.
o combinarse para evitar el envío de valores de encabezado no válidos a un cliente
establecer involuntariamente una política más permisiva de la prevista.
El {origin_request_header}
especial se propaga con el encabezado HTTP Origin
.
en la solicitud del cliente. Esto se puede establecer como un valor de encabezado de respuesta personalizado en un
para el encabezado Access-Control-Allow-Origin
.
Para obtener más detalles, consulta la especificación de la API de RouteAction.CORSPolicy
.
Campos de la política de CORS
En la siguiente tabla, se describen los campos que contiene una política de CORS.
Campo | Descripción | Ejemplo |
---|---|---|
allowOrigins |
Establece el encabezado de respuesta
Por ejemplo, si tu contenido de video se publica desde
|
Access-Control-Allow-Origins: https://stream.example.com
|
maxAge |
Establece el encabezado de respuesta Algunos navegadores limitan este valor a 2 horas o menos, incluso si se especifica el valor máximo (86,400 s). |
Access-Control-Max-Age: 7200
|
allowMethods |
Establece el encabezado de respuesta De forma predeterminada, Media CDN solo admite los métodos |
Access-Control-Allow-Methods: GET, OPTIONS, HEAD
|
allowHeaders |
Establece el encabezado A menudo, esto es necesario para los reproductores de video, que necesitan acceder a algunos encabezados de respuesta para el contenido de video cuando lo solicitan entre dominios. |
Access-Control-Allow-Headers: Content-Type, If-Modified-Since,
Range, User-Agent
|
exposeHeaders |
Establece el encabezado de respuesta A menudo, esto es necesario para los reproductores de video, que podrían necesitar acceder a encabezados de respuesta específicos para el contenido de video cuando solicitan contenido entre dominios. |
Access-Control-Expose-Headers: Date, Cache-Status, Content-Type,
Content-Length
|
allowCredentials |
Establece el encabezado de respuesta Este encabezado se omite cuando se establece como falso. |
Access-Control-Allow-Credentials: true
|
disabled |
Inhabilita el corsPolicy sin quitarlo. Las solicitudes de OPTIONS previas al vuelo se proxy al origen.
|
N/A |
Ejemplo de corsPolicy
En el siguiente ejemplo de configuración, se muestra una configuración básica de 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"
Cómo solucionar problemas relacionados con el enrutamiento
Si algunas solicitudes no recuperan resultados coincidentes o muestran errores, verifica lo siguiente:
- Una ruta debe tener un
matchRule
con exactamente uno deprefixMatch
,fullPathMatch
opathTemplateMatch
definido. La API devuelve un error si no incluyas uno de esos campos. - Asegúrate de que el
priority
de cada ruta esté configurado correctamente: más específico. Las rutas (más largas) deben tener una prioridad más alta sobre las rutas más cortas o anchas de rutas. - De forma predeterminada, solo se admiten las solicitudes
GET
,HEAD
yOPTIONS
. Para configurar la compatibilidad con otros métodos, consulta Métodos de enrutamiento. Los métodos que no están habilitados para una ruta en particular se rechazan con un error HTTP405 (Method Not Allowed)
- Las solicitudes HTTP
GET
con un cuerpo o cualquier solicitud con remolques se rechazan con un error HTTP400
, ya que los cuerpos de solicitud no se permiten en las solicitudesGET
. - La coincidencia de parámetros de consulta y encabezados es un “Y” lógico: la solicitud debe coincidir con todas las claves de parámetros de consulta o encabezados (y los valores, si se especifican) para coincidir con la ruta determinada.
¿Qué sigue?
- Revisa la documentación sobre cómo configurar el almacenamiento en caché.
- Obtén información para conectarte a diferentes orígenes.
- Configura certificados TLS (SSL) para tu servicio.
- Configura las solicitudes firmadas para autenticar el acceso al contenido.