本文为您介绍多种场景下,EdgeScript规则的示例。

拉流FLV本地鉴权

拉流FLV本地鉴权场景示例如下:
  • 需求
    .flv类请求,自定义防盗链需求如下:
    • 规则1:参数sign或参数expires不存在,响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。
    • 规则2:参数t表示过期时间,若参数t小于当前时间,则响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。
    • 规则3:md5与sign匹配,若不匹配,则响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。
  • 参数说明
    • expires:URL参数,Unix时间戳过期校验。必须大于服务器的当前时间。
    • sign:签名字段,生成的规则为sign=md5($uri + $expires + $secret)
  • 对应的EdgeScript规则
    secret='abc'
    
    if eq(substr($uri, -4, -1), '.flv') {
    
        if or(not($arg_sign), not($arg_expires)) {
            add_rsp_header('X-AUTH-MSG', 'auth failed - missing necessary arg')
            exit(403)
        }
    
        t = tonumber($arg_expires)
        if gt(now(), t) {
            add_rsp_header('X-AUTH-MSG', 'auth failed - expired url')
            exit(403)
        }
    
        digest = md5(concat($uri, $arg_expires, secret))
        if ne(digest, $arg_sign) {
            add_rsp_header('X-AUTH-MSG', 'auth failed - invalid sign')
            exit(403)
        }
    }

拉流FLV黑名单

拉流FLV黑名单场景示例如下:
  • 需求

    UserAgent黑名单功能。

    请求头名称中出现的-,需要使用_替代,例如:X-USER-ID对应为x_user_id。

  • 对应的EdgeScript规则
    if eq(substr($uri, -4, -1), '.flv') {
    
        blacklist = []
        set(blacklist, 'black1', 1)
        set(blacklist, 'black2', 1)
    
        ua = req_header('user_agent')
    
        if eq(get(blacklist, ua), 1) {
            exit(403)
        }
    }

拉流FLV IP粒度禁播

拉流FLV IP黑名单场景示例如下:
  • 需求

    禁止新加坡、中国台湾、珠海市、电信的用户IP播放。

    说明 国家编码等信息,请参见附录
  • 对应的EdgeScript规则
    if eq(substr($uri, -4, -1), '.flv') {
        c_country = client_country()
        c_region = client_region()
        c_city = client_city()
        c_isp = client_isp()
        
        if eq(c_country, 'SG') {
            exit(403)
        }
      
        if eq(c_region, 'TW_01') {
            exit(403)
        }
      
        if eq(tonumber(c_city), 440400) {
            exit(403)
        }
      
        if eq(tonumber(c_isp), 100017) {
            exit(403)
        }
    }

拉流FLV URI改写

拉流FLV URI改写场景示例如下:
  • 需求

    根据pattern参数,给URI添加上后缀。如:

    pattern = 1, uri = /test/live.flv --> /test/live1.flv

  • 对应的EdgeScript规则
    if eq(substr($uri, -4, -1), '.flv') {
        if $arg_pattern {
            dst = concat(substr($uri, 1, -5), $arg_pattern, '.flv')
            rewrite(dst, 'break')
        }
    }

定制化鉴权逻辑

自定义鉴权算法场景示例如下:
  • 需求
    • 请求URL格式:/path/digest/?.ts?key=&t=
    • 针对.ts类请求,自定义防盗链需求如下:
      • 规则1:参数t或参数key不存在,响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。
      • 规则2:参数t表示过期时间,若参数t小于当前时间,则响应403,增加响应头X-AUTH-MSG标识鉴权失败原因。
      • 规则3:md5digest匹配。若md5digest不匹配,响应403。

        md5取值格式为:私钥 + path + 文件名.后缀

  • 对应的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)
        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改写
    • 需求

      将用户请求/hello在CDN内部改写成/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')
      }