全部产品
Search
文档中心

CDN:EdgeScript场景示例

更新时间:Dec 19, 2023

本文为您介绍EdgeScript的定制化鉴权逻辑、定制化请求头和响应头控制、定制化改写和重定向、定制化缓存控制和定制化限速的场景示例。

定制化鉴权规则

自定义鉴权规则场景示例如下:

  • 需求

    • 请求URL格式:/path/digest/?.ts?key=&t=

    • 针对.ts类请求,自定义防盗链需求如下:

      • 规则1:参数t或参数key不存在,响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。

      • 规则2:参数t表示过期时间,若参数t小于当前时间,则响应403,增加响应头X-AUTH-MSG标识鉴权失败原因(此类鉴权注意关注客户端与CDN侧取时间可能会有差异,客户端请求URL中携带的时间快慢都可能会影响到鉴权结果,导致鉴权失败)。

      • 规则3:md5(私钥 + path + 文件名.后缀)==digest;若digest不匹配,响应403。

  • 对应的EdgeScript规则

    #鉴权类型的判断
    if eq(substr($uri, -3, -1), '.ts') {
      #参数是否存在判断
        if or(not($arg_t), not($arg_key)) {
        add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg')
        exit(403)
      }
      #是否为数字判断
        t = tonumber($arg_t)
      if not(t) {
        add_rsp_header('X-AUTH-MSG', 'auth failed - invalid time')
        exit(403)
      }
      #鉴权时间是否过期判断
        if gt(now(), t) {
        add_rsp_header('X-AUTH-MSG', 'auth failed - expired url')
        exit(403)
      }
      #鉴权算法,对请求进行正则提取
        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)
      }
    
      key = 'b98d643a-9170-4937-8524-6c33514bbc23'
      #待签算的鉴权串拼接
        signstr = concat(key, sec1, sec3)
      digest = md5(signstr)
      #签算和请求中的token串比较
        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)
      }
    }

定制化请求头和响应头控制

文件自动重命名场景示例如下:

示例:

add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
说明
  • 通过在HTTP应答中添加响应头“Content-Disposition:attachment”来实现消息体的强制下载,并且有参数filename时,自动重命名为filename,无参数时,使用默认命名。

  • filename增加双引号,34为双引号的ascii,可经tochar转回字符串。

输出:

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

对应的EdgeScript规则:

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

定制化改写和重定向

定制化改写和重定向场景示例如下:

  • 精确URI改写

    • 需求

      将用户请求/helloCDN内部改写成/index.html,回源和缓存的URI都将变成/index.html,参数保持原样。

    • 对应的EdgeScript规则

      if match_re($uri, '^/hello$') {
          rewrite('/index.html', 'break')
      }
  • 文件后缀改写

    • 需求

      将用户请求的URI信息/1.txt,在CDN节点上改写成/1.<url参数type>,即,使用请求URL中携带的type参数值来替换URI中的文件后缀,例如:/1.txt?type=mp4将会被改成/1.mp4?type=mp4然后回源获取文件,并缓存在CDN节点上。

    • 对应的EdgeScript规则

      if and(match_re($uri, '^/1.txt$'), $arg_type) {
           rewrite(concat('/1.', $arg_type), 'break')
      }
  • 文件后缀小写化

    • 需求

      将URI改成小写。

    • 对应的EdgeScript规则

      pcs = capture_re($uri, '^(.+%.)([^.]+)')
      section = get(pcs, 1)
      postfix = get(pcs, 2)
      
      if and(section, postfix) {
          rewrite(concat(section, lower(postfix)), 'break')
      }
  • 添加URI前缀

    • 需求

      将用户请求^/nn_live/(.*),在CDN节点上改写为/3rd/nn_live/$1

    • 对应的EdgeScript规则

      pcs = capture_re($uri, '^/nn_live/(.*)')
      sec = get(pcs, 1)
      
      if sec {
           dst = concat('/3rd/nn_live/', sec)
           rewrite(dst, 'break')
      }
  • 302重定向

    • 需求

      将根目录/,302重定向到/app/movie/pages/index/index.html页面。

    • 对应的EdgeScript规则

      if eq($uri, '/') {
          rewrite('/app/movie/pages/index/index.html', 'redirect')
      }
  • 302重定向HTTPS

    • 需求

      将如下URI(对根目录匹配,^/$)跳转到https://demo.aliyundoc.com/index.html ,跳转后的URI可按需填写。

      • http://demo.aliyundoc.com

      • https://demo.aliyundoc.com

    • 对应的EdgeScript规则

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

定制化缓存控制

自定义缓存时长的场景样例如下:

  • 需求

    根据各类条件,自定义资源缓存时长。

  • 对应的EdgeScript规则

    if match_re($uri, '^/image') {
        set_cache_ttl('code', '301=10,302=5')
    }
    
    if eq(substr($uri, -4, -1), '.mp4') {
        set_cache_ttl('path', 5)
    }
    if match_re($uri, '^/201801/mp4/') {
        set_cache_ttl('path', 50)
    }
    if match_re($uri, '^/201802/flv/') {
        set_cache_ttl('path', 10)
    }
    说明

    /image开头的URI,针对响应码设置缓存时长,301缓存10s,302缓存5s。

定制化限速

自定义限速值的场景样例如下:

  • 需求

    如果有参数spunit,则实施限速。sp参数指明限速数值,unit为参数单位,KB或MB。

  • 对应的EdgeScript规则

    if and($arg_sp, $arg_unit) {
        sp = tonumber($arg_sp)
        if not(sp) {
            add_rsp_header('X-LIMIT-DEBUG', 'invalid sp')
            return false
        }
    
        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
    }

区域、运营商访问限制

区域、运营商访问限制的场景样例如下:

  • 需求

    • 通过识别客户端请求中携带的IP地址的区域、运营商归属来实现访问限制。

    • 识别客户端IP的区域、运营商归属的函数如下。详细请参见请求判断相关

      • client_region:使用该函数可以返回客户端IP归属地区的编码。

      • client_isp:使用该函数可以返回客户端IP归属运营商的编码。

  • 对应的EdgeScript规则

    # 省份限制,省份不匹配的,禁止访问
    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)
    }
    
    # 运营商限制,运营商不匹配的,禁止访问
    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)
    }