Tous les produits
Search
Centre de documentation

CDN:EdgeScript use case examples

Dernière mise à jour :Aug 21, 2026

EdgeScript vous permet d'écrire une logique personnalisée qui s'exécute sur les points de présence (POP) d'Alibaba Cloud CDN, sans intervenir sur votre serveur d'origine. Utilisez EdgeScript pour contrôler l'authentification, les en-têtes, les réécritures d'URL, les valeurs de durée de vie du cache (TTL), la limitation de débit et le contrôle d'accès à la périphérie.

Le tableau suivant résume les scénarios abordés dans cette rubrique :

Scénario

Fonctionnalité

Authentification

Valide les signatures d'URL pour les requêtes .ts ; renvoie un code HTTP 403 en cas d'échec

En-têtes de requête et de réponse

Définit Content-Disposition pour déclencher le téléchargement d'un fichier nommé

Réécritures et redirections

Réécrit les URI, modifie les extensions de fichier, normalise la casse, ajoute des préfixes, effectue des redirections 302

Contrôle du cache

Définit les valeurs TTL par modèle d'URL ou par code d'état HTTP

Limitation de débit

Limite le taux de transfert en fonction des paramètres d'URL

Contrôle d'accès par région et FAI

Bloque les requêtes provenant de régions ou de fournisseurs d'accès Internet (FAI) spécifiques

Personnalisation des règles d'authentification

L'authentification EdgeScript couvre divers scénarios, notamment la validation des signatures d'URL (protection contre le hotlinking), l'application des listes d'autorisation IP et le filtrage User-Agent. Le script ci-dessous met en œuvre une protection contre le hotlinking basée sur la signature d'URL pour les requêtes .ts.

Le script applique trois règles séquentielles :

  1. La requête doit inclure les paramètres t (heure d'expiration) et key ; sinon, le POP renvoie un code HTTP 403.

  2. Le paramètre t doit être un nombre valide et ne doit pas être antérieur à l'heure actuelle du POP ; sinon, le POP renvoie un code HTTP 403.

  3. Le hachage MD5 de (clé privée + chemin + nom_fichier.extension) doit correspondre au segment digest de l'URL ; sinon, le POP renvoie un code HTTP 403.

Format de l'URL de requête : /path/digest/?.ts?key=&t=

# Only apply authentication to .ts requests
if eq(substr($uri, -3, -1), '.ts') {

  # Rule 1: Reject if t or key parameters are missing
  if or(not($arg_t), not($arg_key)) {
    add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg')
    exit(403)
  }

  # Rule 2: Reject if t is not a valid number
  t = tonumber($arg_t)
  if not(t) {
    add_rsp_header('X-AUTH-MSG', 'auth failed - invalid time')
    exit(403)
  }

  # Reject if the URL has expired.
  # t is compared against the POP's local clock, not the client clock.
  # If the client clock differs significantly from the POP clock, valid
  # requests may be rejected. Add a time buffer when generating signed URLs.
  if gt(now(), t) {
    add_rsp_header('X-AUTH-MSG', 'auth failed - expired url')
    exit(403)
  }

  # Rule 3: Extract path segments using a regular expression
  pcs = capture_re($request_uri,'^/([^/]+)/([^/]+)/([^?]+)%?(.*)')
  sec1 = get(pcs, 1)
  sec2 = get(pcs, 2)
  sec3 = get(pcs, 3)

  if or(not(sec1), not(sec2), not(sec3)) {
    add_rsp_header('X-AUTH-MSG', 'auth failed - malformed url')
    exit(403)
  }

  # Compute MD5(private_key + path + filename) and compare with digest
  key = 'b98d643a-9170-4937-8524-6c33514bbc23'
  signstr = concat(key, sec1, sec3)
  digest = md5(signstr)

  if ne(digest, sec2) {
    add_rsp_header('X-AUTH-DEBUG', concat('signstr: ', signstr))
    add_rsp_header('X-AUTH-MSG', 'auth failed - invalid digest')
    exit(403)
  }
}

Personnalisation des en-têtes de requête et de réponse

Le script ci-dessous définit l'en-tête de réponse Content-Disposition pour déclencher un téléchargement automatique de fichier avec un nom personnalisé. Lorsque la requête inclut un paramètre d'URL filename, le navigateur enregistre le corps de la réponse sous ce nom. Si le paramètre est absent, le navigateur utilise le nom de fichier par défaut.

En-tête de réponse attendu :

Content-Disposition: attachment;filename="monitor.apk"
Remarque

La valeur du nom de fichier est entourée de guillemets doubles. tochar(34) convertit le code ASCII 34 en caractère ", car les guillemets ne peuvent pas être intégrés directement dans la chaîne.

if $arg_filename {
  hn = 'Content-Disposition'
  hv = concat('attachment;filename=', tochar(34), $arg_filename, tochar(34))
  add_rsp_header(hn, hv)
}

Personnalisation des réécritures et des redirections

Réécriture d'une URI

Réécrit /hello en /index.html. La requête vers l'origine utilise /index.html et tous les paramètres d'URL sont conservés.

if match_re($uri, '^/hello$') {
    rewrite('/index.html', 'break')
}

Réécriture d'une extension de fichier

Remplace l'extension de fichier dans l'URI par la valeur du paramètre d'URL type. Par exemple, /1.txt?type=mp4 devient /1.mp4?type=mp4 avant que la requête ne soit transférée à l'origine. Le contenu récupéré est ensuite mis en cache sur les POP CDN.

if and(match_re($uri, '^/1.txt$'), $arg_type) {
    rewrite(concat('/1.', $arg_type), 'break')
}

Conversion d'une extension de fichier en minuscules

Normalise l'extension de fichier en minuscules. Par exemple, /image/Photo.JPG devient /image/Photo.jpg.

pcs = capture_re($uri, '^(.+%.)([^.]+)')
section = get(pcs, 1)
postfix = get(pcs, 2)

if and(section, postfix) {
    rewrite(concat(section, lower(postfix)), 'break')
}

Ajout d'un préfixe d'URI

Réécrit toute URI correspondant à ^/nn_live/(.*) en ajoutant le préfixe /3rd. Par exemple, /nn_live/stream1 devient /3rd/nn_live/stream1.

pcs = capture_re($uri, '^/nn_live/(.*)')
sec = get(pcs, 1)

if sec {
    dst = concat('/3rd/nn_live/', sec)
    rewrite(dst, 'break')
}

Exécution d'une redirection 302

Redirige les requêtes vers le chemin racine / vers /app/movie/pages/index/index.html.

if eq($uri, '/') {
    rewrite('/app/movie/pages/index/index.html', 'redirect')
}

Redirection vers une URL HTTPS

Redirige les requêtes vers le chemin racine, qu'elles arrivent via HTTP ou HTTPS, vers une URL HTTPS spécifique. Remplacez https://demo.aliyundoc.com/index.html par votre URL cible.

if eq($uri, '/') {
    rewrite('https://demo.aliyundoc.com/index.html', 'redirect')
}

Personnalisation du contrôle du cache

Le script ci-dessous définit la durée de vie (TTL) des ressources mises en cache en fonction des modèles d'URL et des codes d'état HTTP.

# For /image URLs: cache 301 responses for 10 s, 302 responses for 5 s
if match_re($uri, '^/image') {
    set_cache_ttl('code', '301=10,302=5')
}

# For .mp4 files: TTL = 5 s
if eq(substr($uri, -4, -1), '.mp4') {
    set_cache_ttl('path', 5)
}

# For /201801/mp4/ paths: TTL = 50 s
if match_re($uri, '^/201801/mp4/') {
    set_cache_ttl('path', 50)
}

# For /201802/flv/ paths: TTL = 10 s
if match_re($uri, '^/201802/flv/') {
    set_cache_ttl('path', 10)
}

set_cache_ttl accepte deux modes :

  • 'code' — définit la TTL par code d'état HTTP, en utilisant le format '<code>=<seconds>[,<code>=<seconds>]'

  • 'path' — définit la TTL en secondes pour toutes les réponses correspondant au modèle d'URI

Personnalisation des politiques de limitation de débit

Le script ci-dessous lit les paramètres sp (limite de vitesse) et unit de l'URL de requête et applique la limitation de débit à l'aide de limit_rate(). Les deux paramètres doivent être présents pour que la limitation prenne effet.

Paramètre

Description

Valeurs valides

sp

Taux de transfert maximal avant application de la limitation

Entier positif

unit

Unité du taux

k (Ko) ou m (Mo)

if and($arg_sp, $arg_unit) {

  # Validate that sp is a positive integer
  sp = tonumber($arg_sp)
  if not(sp) {
    add_rsp_header('X-LIMIT-DEBUG', 'invalid sp')
    return false
  }

  # Validate that unit is k (KB) or m (MB)
  if and(ne($arg_unit, 'k'), ne($arg_unit, 'm')) {
    add_rsp_header('X-LIMIT-DEBUG', 'invalid unit')
    return false
  }

  add_rsp_header('X-LIMIT-DEBUG', concat('set on: ', sp, $arg_unit))
  limit_rate(sp, $arg_unit)
  return true
}

Contrôle d'accès basé sur la région et le FAI

Le script ci-dessous restreint l'accès en fonction de la région et du fournisseur d'accès Internet (FAI) de l'adresse IP du client. Les requêtes provenant d'une région ou d'un FAI non inclus dans la liste d'autorisation sont bloquées avec un code HTTP 403.

client_region() renvoie le code de région de l'IP client. client_isp() renvoie le code du FAI. Pour la liste complète des codes de région et de FAI, consultez Fonctions de logique de requête.

# Block requests from regions not in the allowlist
ip_region_id = client_region()
if not(match_re(ip_region_id, '440000|370000')) {
    add_rsp_header('X-REGION-BLOCK-DEBUG', concat('hit ip_region_id:', ip_region_id))
    exit(403)
}

# Block requests from ISPs not in the allowlist
ip_isp_id = client_isp()
if not(match_re(ip_isp_id, '100017|100025')) {
    add_rsp_header('X-REGION-BLOCK-DEBUG', concat('hit ip_isp_id:', ip_isp_id))
    exit(403)
}

Remplacez '440000|370000' et '100017|100025' par les codes de région et de FAI correspondant à votre politique d'accès.