すべてのプロダクト
Search
ドキュメントセンター

CDN:EdgeScriptの一般的なシナリオ

最終更新日:Jan 24, 2024

このトピックでは、認証ロジックのカスタマイズ、リクエストヘッダーとレスポンスヘッダーのカスタマイズ、書き換えとリダイレクトのカスタマイズ、キャッシュコントロールのカスタマイズ、スロットリングのカスタマイズなど、EdgeScriptの使用シナリオについて説明します。

認証ルールのカスタマイズ

次の例は、認証ルールをカスタマイズする方法を示しています。

  • 使用シナリオ

    • リクエストURL形式: /path/digest/?.ts?key=&t=

    • のため。ts要求、ホットリンク保護をカスタマイズするための要件は次のとおりです。

      • ルール1: リクエストにtまたはkeyパラメーターが含まれていない場合、POP (point of presence) はHTTP 403ステータスコードを返し、障害の原因を示すX-AUTH-MSGレスポンスヘッダーを追加します。

      • ルール2: tパラメーターは有効期限を指定します。 指定されたtパラメーターが現在の時刻より前の場合、POPはHTTP 403ステータスコードを返し、失敗の原因を示すX-AUTH-MSGレスポンスヘッダーを追加します。 この認証では、クライアントで取得されたタイムスタンプとCDN POPとの間にギャップがあり、認証が失敗する可能性があることに注意してください。

      • ルール3: md5 (プライベートキー + パス + ファイル名. ファイル名拡張子) == digest。 md5がダイジェストと一致しない場合、POPはHTTP 403ステータスコードを返します。

  • Script

    # 認証タイプの決定
    if eq(substr($uri, -3, -1), '.ts) {
      # パラメーターが存在するかどうかの確認
        if or(not($arg_t) 、not($arg_key)) {
        add_rsp_header('X-AUTH-MSG '、'auth failed - missing need 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)
      }
    
      キー='b98d643a-9170-4937-8524-6c33514bbc23'
      # 連結された認証文字列に署名する
        signstr = concat(key, sec1, sec3)
      digest = md5(signstr)
      # 署名とリクエストのトークン文字列を比較する
        if ne (ダイジェスト, 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)))
説明
  • レスポンスヘッダーContent-Disposition:attachmentをHTTPレスポンスに追加して、メッセージ本文を自動的にダウンロードできます。 さらに、レスポンスにfilenameパラメーターが含まれている場合は、自動的にfilenameに名前が変更されます。 応答にfilenameパラメータが含まれていない場合は、デフォルトの名前が使用されます。

  • filenameパラメーターの値は、二重引用符 ("") で囲まれています。 文字列「34」は、二重引用符のASCII文字列である。 tochar関数を使用して、引用符文字列 ("") に戻すことができます。

出力:

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

スクリプト:

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

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

次の例は、書き換えとリダイレクトをカスタマイズする方法を示しています。

  • URIを書き直します。

    • 使用シナリオ

      CDN を有効にして、/hello/index.htmlに書き換えます。 その結果、back-to-originリクエストのURIは /index.htmlに変更され、パラメーターは変更されません。

    • Script

      if match_re($uri, '^/hello$') {
          書き換え ('/index.html', 'break')
      } 
  • ファイル拡張子を書き直します。

    • 使用シナリオ

      Alibaba Cloud CDNを有効にして、CDN POPでURI /1.txt/1.<URL parameter type> に書き換えます。 その結果、URIのファイル名拡張子は、リクエストURLのtypeパラメーターの値に置き換えられます。 たとえば、リクエストがオリジンサーバーにリダイレクトされる前に、/1.txt? type=mp4/1.mp4?type=mp4に変更されます。 次に、取得したコンテンツはCDN POPにキャッシュされます。

    • Script

      if and(match_re($uri, '^/1.txt$'), $arg_type) {
           rewrite(concat('/1.', $arg_type), 'break ')
      } 
  • ファイル拡張子を小文字に変換します。

    • 使用シナリオ

      URI文字列を小文字に変換します。

    • Script

      pcs = capture_re($uri, '^(.+ %.)([^.]+)')
      section = get(pcs, 1)
      postfix = get(pcs, 2)
      
      if and (セクション、postfix) {
          rewrite(concat (セクション、lower(postfix)) 、'break')
      } 
  • URIプレフィックスを追加します。

    • 使用シナリオ

      Alibaba Cloud CDNを有効にして、CDN POPで ^/nn_live/(.*)/3rd/nn_live/$1に書き換えます。

    • Script

      pcs = capture_re($uri, '^/nn_live/(.*)')
      sec = get(pcs、1)
      
      if sec {
           dst = concat('/3rd/nn_live/' 、sec)
           rewrite(dst, 'break')
      } 
  • 302リダイレクトの実行

    • 使用シナリオ

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

    • Script

      if eq($uri, '/') {
          書き換え ('/app/movie/pages/index/index.html' 、'redirect')
      } 
  • HTTPS URIへの302リダイレクトの実行

    • 使用シナリオ

      ^/$ のルートディレクトリに一致する次のURIをhttps://rtmp.cdnpe.com/index.htmlにリダイレクトします。 必要に応じて最終URIを指定できます。

      • http://demo.aliyundoc.com

      • https://demo.aliyundoc.com

    • Script

      if eq($uri, '/') {
          書き換え ('https:// demo.aliyundoc.com/index.html' 、'redirect')
      } 

キャッシュ制御のカスタマイズ

次の例は、キャッシュされたリソースの有効期限 (TTL) 値をカスタマイズする方法を示しています。

  • 使用シナリオ

    さまざまな条件に基づいて、キャッシュされたリソースのTTL値をカスタマイズします。

  • Script

    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で始まるURLの場合、HTTP 301ステータスコードのTTL値を10秒、HTTP 302ステータスコードのTTL値を5秒に設定します。

調整ポリシーのカスタマイズ

次に、スロットリングポリシーをカスタマイズする例を示します。

  • 使用シナリオ

    spunitパラメーターが設定されている場合、スロットリングが実装されます。 spパラメーターは、スロットリングがトリガーされる前の最大しきい値を指定します。 unitパラメーターは、ユニットを指定します。 単位はKBまたはMBです。

  • Script

    ifおよび ($arg_sp, $arg_unit) {
        sp = tonumber($arg_sp)
        if not(sp) {
            add_rsp_header('X-LIMIT-DEBUG ', 'invalid sp')
            falseを返します
        }
    
        if and(ne($arg_unit, 'k'), ne($arg_unit, 'm')) {
            add_rsp_header('X-LIMIT-DEBUG '、'invalid unit')
            falseを返します
        }
    
        add_rsp_header('X-LIMIT-DEBUG '、concat('set on: ' 、sp、$arg_unit))
        limit_rate(sp、$arg_unit)
        trueを返す
    } 

リージョンおよびISPベースのアクセス制御

リージョンおよびISPベースのアクセス制御の例を次に示します。

  • シナリオの使用

    • アクセス制御は、クライアント要求に含まれるIPアドレスの地域およびインターネットサービスプロバイダ (ISP) を識別することによって実施される。

    • クライアントIPアドレスのリージョンとISPを識別するには、次の機能を使用します。 詳細については、「ロジック関数のリクエスト」をご参照ください。

      • client_region: クライアントIPアドレスのリージョンのコードを返します。

      • client_isp: クライアントIPアドレスのインターネットサービスプロバイダー (isp) のコードを返します。

  • Script

    # リージョンの制限。 リージョンが一致しない場合、アクセスはブロックされます。
    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)
    }
    
    # リージョンの制限。 ISPが一致しない場合、アクセスはブロックされます。
    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)
    }