このトピックでは、特定のシナリオに適用できるEdgeScriptルールの例について説明します。

FLVプルのローカル認証

次の例は、FLVプルにローカル認証を使用する方法を示しています。
  • 要件
    のために。flvのリクエストでは、ホットリンク保護の要件は次のように定義されます。
    • ルール1: リクエストにsignまたはexpiresパラメーターが含まれていない場合、CDNノードは403ステータスコードを返し、障害の原因を示すX-AUTH-MSGレスポンスヘッダーを追加します。
    • ルール2: tパラメーターは有効期限を指定します。 tパラメーターの値が現在の時刻より前の場合、CDNノードは403ステータスコードを返し、障害の原因を示すX-AUTH-MSGレスポンスヘッダーを追加します。
    • ルール3: md5の値はsignの値と一致します。 両方の値が一致しない場合、CDNノードは403のステータスコードを返します。 失敗の原因を示すために、応答ヘッダX-AUTH − MSGが追加される。
  • Parameters
    • expires: 有効期限 (Unixタイムスタンプ) を定義するURLパラメーター。 このパラメーター値は、現在のサーバー時刻より大きくなければなりません。
    • 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 need 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 (ダイジェスト, $arg_sign) {
            add_rsp_header('X-AUTH-MSG', 'auth failed - invalid sign')
            exit(403)
        }
    }

User-Agent blacklist for FLV pull

次の例は、FLVプルにUser-Agentブラックリストを使用する方法を示しています。
  • 要件

    User-Agentブラックリスト機能。

    リクエストヘッダーのハイフン (-) をアンダースコア (_) に置き換える必要があります。 For example, X-USER-ID is replaced with x_user_id.

  • EdgeScriptルール
    if eq(substr($uri, -4, -1), '.flv') {
    
        blacklist = []
        set (ブラックリスト, 'black1', 1)
        set (ブラックリスト, 'black2', 1)
    
        ua = req_header('user_agent')
    
        if eq(get(blacklist, ua), 1) {
            exit(403)
        }
    }

IPアドレスによるFLVストリーミング禁止

次の例は、FLVプルにIPアドレスブラックリストを使用する方法を示しています。
  • 要件

    シンガポール、台湾 (中国) 、珠海、チャイナテレコム出身のユーザーがFLVコンテンツをストリーミングすることを禁止します。

    国コードの詳細については、「付録」をご参照ください。
  • 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)
        }
    }

URI rewrite for FLV pull

次の例は、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 のリクエストの hotlink 保護のカスタマイズの要件は次のとおりです。
      • ルール 1: リクエストに t またはkey パラメーターが含まれていない場合、CDN ノードがステータスコード 403 を返し、障害の原因を示すX-AUTH-MSG レスポンスヘッダーを追加します。
      • ルール 2: t パラメーターは絶対的な有効期限を指定します。 指定された t パラメーターが現刻より早い場合、CDN ノードはステータスコード 403 を返し、障害の原因を示す X-AUTH-MSG レスポンスヘッダーを追加します。
      • ルール 3: CDN ノードが md5 パラメーターと digest パラメーターを照合します。 md5 digest が一致しない場合、CDN ノードはステータスコード 403 を返します。

        md5 パラメーターの値の形式 : Private key + Path + File name.extension

  • 対応する 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)
        }
    
    }

リクエストヘッダーとレスポンスヘッダーのカスタマイズ

ファイル名の自動変更の例を以下に示します。
  • 要件

    filename パラメーターが指定されている場合、ファイル名は、 filename パラメーターで指定されている値へ自動的に変更されます。 ファイル名が指定されていない場合は、既定のファイル名が使用されます。

  • 対応する EdgeScript ルール
    if $arg_filename {
        hn = 'Content-Disposition'
        hv = concat('attachment;filename=', $arg_filename)
        add_rsp_header(hn, hv)
    }
    
    The following rule has the similar effect as the preceding rule, but the value for the filename parameter is enclosed in a pair of double quotation marks. 文字列 "34" は、二重引用符の ASCII 文字列です。 tochar 関数を使用して引用符文字列 ("") に再変換が可能です。
    add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
    Output: Content-Disposition: attachment;filename="monitor.apk"

書き換えまたはリダイレクトのカスタマイズ

書き換えとリダイレクトのカスタマイズの例を以下に示します。
  • URI の書き換え
    • 要件

      /hello /index.html に書き換えるよう、CDN を設定します。 これによって、元のリクエストの URI が /index.html に変更されている場合、パラメーターは変更されません。

    • 対応する EdgeScript ルール
      if match_re($uri, '^/hello$') {
          rewrite('/index.html', 'break')
      }
  • ファイル拡張子の書き換え
    • 要件

      /1.txt /1. <value of arg_type> に書き換えるよう CDN を設定します。 例 : /1.txt? type=mp4 /1.mp4? type=mp4 (オリジンフェッチおよびキャッシュ) に書き換えられます 。

    • 対応する 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/(. *) /3rd/nn_live/$1に書き換えるようCDN を設定します。

    • 対応する EdgeScript ルール
      pcs = capture_re($uri, '^/nn_live/(.*)')
      sec = get(pcs, 1)
      
      if sec {
           dst = concat('/3rd/nn_live/', sec)
           rewrite(dst, 'break')
      }
  • 302 リダイレクトの設定
    • 要件

      / ルートディレクトリの /app/movie/pages/index/index.html への 302 リダイレクトを実行します。

    • 対応する EdgeScript ルール
      if eq($uri, '/') {
          rewrite('/app/movie/pages/index/index.html', 'redirect')
      }
  • HTTPS 302 リダイレクトの設定
    • 要件
      ^/$ルートディレクトリに一致する次の URI をhttps://rtmp.cdnpe.com/index.html にリダイレクトします。 必要に応じて、リダイレクトされる URI を指定することができます。
      • http://rtmp.cdnpe.com
      • https://rtmp.cdnpe.com
    • 対応する EdgeScript ルール
      if eq($uri, '/') {
          rewrite('https://rtmp.cdnpe.com/index.html', 'redirect')
      }