Définir des en-têtes personnalisés

Media CDN vous permet de spécifier des en-têtes de requête et de réponse personnalisés.

Les en-têtes personnalisés vous permettent d'effectuer les opérations suivantes :

  • Renvoyez des données géographiques sur le client, telles que le pays, la région ou la ville, que vous pouvez utiliser pour afficher du contenu localisé.
  • Déterminez si une réponse a été diffusée à partir du cache (en totalité ou en partie) et à partir de quel emplacement de cache.
  • Supprimez, remplacez ou ajoutez à la fois les en-têtes de requête et de réponse.

Vous pouvez également utiliser des en-têtes pour acheminer les requêtes vers des origines différentes. Si vous devez configurer des en-têtes CORS (Cross-Origin Resource Sharing), configurez une règle CORS pour chaque route.

Appliquer des en-têtes personnalisés

Des en-têtes sont définis sur chaque route, ce qui vous permet d'ajouter et de supprimer des en-têtes pour différents contenus, tels que des fichiers manifestes ou des segments vidéo.

Par défaut, les valeurs d'en-tête ajoutées sont séparées par une virgule et ajoutées aux en-têtes de réponse ou de requête avec les mêmes noms de champs.

Pour écraser les valeurs existantes, définissez replace sur true.

L'exemple .routing.pathMatchers[].routeRules[].headerAction suivant montre des en-têtes ajoutés et supprimés dans une ressource EdgeCacheService:

gcloud edge-cache services describe prod-media-service
routeRules:
  - priority: 1
    description: "video routes"
    matchRules:
      - prefixMatch: "/video/"
    headerAction:
      responseHeadersToAdd:
        # Return the country (or region) associated with the client's IP address.
        - headerName: "client-geo"
          headerValue: "{client_region}"
          replace: true
      requestHeadersToAdd:
        # Inform the upstream origin server the request is from Media CDN
        - headerName: "x-downstream-cdn"
          headerValue: "Media CDN"
      responseHeadersToRemove:
        - headerName: "X-User-ID"
        - headerName: "X-Other-Internal-Header"

Cet exemple effectue les opérations suivantes :

  • Ajoute un en-tête client-geo personnalisé à la réponse à l'aide de la variable {client_region}, qui renvoie le pays (ou la région) associé à l'adresse IP du client.
  • Ajoute un en-tête x-downstream-cdn personnalisé à la requête à l'aide d'une chaîne statique.
  • Supprime deux en-têtes internes.

Variables d'en-tête dynamiques

Les en-têtes personnalisés peuvent contenir une ou plusieurs variables dynamiques.

Les en-têtes de requête faisant partie de la stratégie de clé de cache (cacheKeyPolicy.includedHeaderNames) peuvent contenir une ou plusieurs variables personnalisées. Les en-têtes de requête contenant d'autres variables dynamiques ne peuvent pas faire partie de la clé de cache.

Variable Description Compatible avec les en-têtes de requêtes Pris en charge pour les en-têtes de requêtes dans une clé de cache Compatible avec les en-têtes de réponse
cdn_cache_status Liste des emplacements (code IATA de l'aéroport le plus proche) et des états de chaque nœud de cache dans le chemin de requête/réponse, séparés par une virgule, où la valeur la plus à droite représente le cache le plus proche de l'utilisateur.
client_city Nom de la ville d'origine de la requête (par exemple, Mountain View pour Mountain View, Californie). Il n'existe pas de liste canonique de valeurs valides pour cette variable. Les noms de ville peuvent contenir des lettres, des chiffres et des espaces au format US-ASCII, ainsi que les caractères suivants : !#$%&'*+-.^_`|~.
client_city_lat_long Latitude et longitude de la ville d'origine de la requête (par exemple, 37.386051,-122.083851 pour une requête provenant de Mountain View).
client_region Pays (ou région) associé à l'adresse IP du client. Il s'agit d'un code de région CLDR au format Unicode, tel que US ou FR. Pour la plupart des pays, ces codes correspondent directement aux codes ISO-3166-2.
client_region_subdivision Subdivision du pays associé à l'adresse IP du client (par exemple, la province ou l'État). Il s'agit d'un ID de subdivision CLDR au format Unicode, tel que USCA ou CAON. Ces codes Unicode sont dérivés des subdivisions définies par la norme ISO-3166-2.
client_rtt_msec Temps de transmission aller-retour estimé entre le CDN et le client HTTP(S), en millisecondes. Il s'agit du paramètre de délai aller-retour lissé (SRTT, Smoothed Round-Trip Time) mesuré par la pile TCP du CDN, conformément à la RFC 2988.
device_request_type Type d'appareil utilisé par le client. Les valeurs suivantes sont valides: DESKTOP, MOBILE, TABLET, SMART_TV, GAME_CONSOLE, WEARABLE et UNDETERMINED.
original_request_id Identifiant unique attribué à la requête qui a initialement généré cette réponse. Renseigné uniquement s'il est différent de request_id pour les réponses mises en cache.
origin_name Ressource EdgeCacheOrigin à partir de laquelle la réponse a été envoyée par proxy.
origin_request_header Reflète la valeur de l'en-tête "Origine" dans la requête pour les cas d'utilisation CORS (Cross-Origin Resource Sharing).
proxy_status Liste des proxys HTTP intermédiaires dans le chemin de réponse. La valeur est définie par la RFC 9209. Une ressource EdgeCacheService est représentée par Google-Edge-Cache. Si la réponse a été récupérée à partir de l'origine, une ressource EdgeCacheOrigin est représentée par Google-Edge-Cache-Origin.
tls_sni_hostname Indication du nom du serveur (telle que définie dans la RFC 6066), si elle est fournie par le client lors du handshake TLS ou QUIC. Le nom d'hôte est converti en minuscules et tous les points se trouvant à la fin sont supprimés.
tls_version Version de TLS négociée entre le client et l'équilibreur de charge lors du handshake SSL. Les valeurs possibles sont TLSv1, TLSv1.1, TLSv1.2 et TLSv1.3. Si le client se connecte à l'aide de QUIC au lieu de TLS, la valeur est QUIC.
tls_cipher_suite La suite de chiffrement négociée lors du handshake TLS. La valeur est définie par le registre de la suite de chiffrement TLS de l'IANA (par exemple, TLS_RSA_WITH_AES_128_GCM_SHA256). Cette valeur est vide pour QUIC et les connexions clientes non chiffrées.
user_agent_family La famille de navigateurs utilisée par le client. Voici les valeurs valides: APPLE, APPLEWEBKIT, BLACKBERRY, DOCOMO, GECKO, GOOGLE, KHTML, KOREAN, MICROSOFT, MSIE, NOKIA, NETFRONT, OBIGO, OPENWAVE, OPERA, OTHER, POLARIS, TELECA, SEMC, SMIT et USER_DEFINED.

Voici quelques points à prendre en compte concernant les variables personnalisées:

  • Les en-têtes de requête et de réponse existants sont conservés, à l'exception des suivants, qui sont supprimés:

    • X-User-IP
    • Tous les en-têtes avec X-Google ou X-GFE
  • Les clés et les valeurs d'en-tête doivent être conformes à la norme RFC 7230, sans les formes obsolètes.

  • Toutes les clés d'en-tête sont en minuscules (selon HTTP/2).

  • Certains en-têtes sont fusionnés. Lorsqu'il existe plusieurs instances de la même clé d'en-tête (par exemple, Via), l'équilibreur de charge combine leurs valeurs dans une même liste d'éléments séparés par des virgules correspondant à une clé d'en-tête unique. Seuls les en-têtes dont les valeurs peuvent être représentées sous la forme d'une liste d'éléments séparés par des virgules sont fusionnés. Les autres en-têtes, tels que Set-Cookie, ne sont jamais fusionnés.

  • Certains en-têtes sont ajoutés ou des valeurs leur sont ajoutées. Media CDN ajoute ou modifie toujours certains en-têtes, tels que Via et X-Forwarded-For.

  • Media CDN développe tout en-tête de réponse contenant une variable compatible, même s'il est défini par le client ou l'origine. Cela vous permet de définir des en-têtes dynamiques à partir de votre client (un lecteur vidéo, par exemple) ou de votre infrastructure d'origine, en plus de configurer des en-têtes personnalisés. Media CDN ne développe pas les variables sur le chemin d'accès de la requête.

  • Par exemple, conformément aux règles décrites précédemment, les en-têtes X-Goog- et X-Amz- sont conservés et mis en minuscules.

Valeurs d'état de cache

La variable d'en-tête {cdn_cache_status} peut renvoyer plusieurs valeurs correspondant au niveau de cache qui a diffusé la réponse. Tenez compte des consignes suivantes pour interpréter la variable d'en-tête {cdn_cache_status}:

  • Si l'en-tête contient hit, le contenu demandé a été récupéré à partir du cache.
  • Si l'en-tête contient miss, le contenu demandé n'a pas été trouvé dans un nœud de cache et a dû être récupéré à partir d'un nœud en amont.
  • Si l'en-tête contient fetch, le contenu demandé a été récupéré à partir de l'origine.
  • Si l'en-tête contient uncacheable, le contenu demandé a été considéré comme ne pouvant pas être mis en cache par certains ou tous les composants de l'infrastructure de mise en cache.

    • Si l'en-tête contient également hit ou miss, le contenu demandé a été considéré comme ne pouvant pas être mis en cache par certains composants de mise en cache, et peut être mis en cache par d'autres.
    • Si l'en-tête ne contient pas également hit ni miss, tous les composants de mise en cache ont considéré que le contenu demandé ne pouvait pas être mis en cache, et toutes les requêtes pour ce contenu sont extraites de l'origine. Pour vous assurer que votre contenu est correctement mis en cache, consultez les exigences concernant l'origine de Media CDN.

En-têtes par défaut

Media CDN ajoute les en-têtes de requête et de réponse suivants aux requêtes d'origine et aux réponses client, respectivement.

En-tête Description Requête Réponse
x-request-id Un identifiant unique de la requête en question. Cette valeur est également ajoutée au journal de requêtes en tant que jsonPayload.requestId, ce qui vous permet de corréler une requête/réponse client avec une entrée de journal.
age

Renvoie l'âge de l'objet mis en cache (nombre de secondes de présence dans le cache). L'âge est généralement calculé en fonction de la date à laquelle l'objet a été initialement mis en cache dans un emplacement de cache à longue traîne (bouclier).

Les réponses sans en-tête age ne sont pas diffusées à partir du cache.

via

Identifie Google comme proxy intermédiaire.

Il est défini sur 1.1 google et ne peut pas être modifié.

server est défini sur Google-Edge-Cache.
cdn-loop

Identifie les boucles, par exemple, où l'hôte d'origine est identique à l'hôte visible par l'utilisateur (en périphérie).

Un jeton google est ajouté à l'en-tête, conformément à la RFC 8586. Le jeton ne peut pas être modifié.

forwarded

La version structurée de l'en-tête x-forwarded-for. L'en-tête forwarded est défini dans le document RFC 7239.

Ces en-têtes vous permettent d'identifier l'adresse IP du client connecté lorsqu'un proxy (ou des proxys) se trouve dans le chemin. Par exemple, si un client avec l'adresse IP 192.0.2.60 se connecte à Media CDN via HTTPS, l'en-tête forwarded est renseigné comme suit:

forwarded: [for=192.0.2.60;proto=https]

Dans le cas de plusieurs proxys côté client, le client qui s'est connecté à Media CDN est la dernière adresse ajoutée dans la valeur d'en-tête.

x-forwarded-for

Versions non structurées et standards de facto de l'en-tête forwarded. Les valeurs sont généralement séparées par des virgules.

Les deux en-têtes sont envoyés dans une requête pour prendre en charge les anciennes origines qui ne connaissent peut-être pas l'en-tête forwarded.

Les clés d'en-tête sont mises en minuscules pour les en-têtes de requête et de réponse, car elles ne sont pas sensibles à la casse.

D'autres en-têtes, y compris l'emplacement du point de présence périphérique (PoP) et l'état du cache (tels que hit et miss), peuvent être ajoutés à l'aide de variables d'en-tête dynamiques.