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

Server Load Balancer:AScript シナリオ例

最終更新日:Mar 06, 2026

このドキュメントでは、ホットリンク保護、ブラックリストとホワイトリスト、カスタムリクエスト/レスポンスヘッダー制御、再書き込み、リダイレクトなどのシナリオにおけるトラフィック転送ルールをカスタマイズするための AScript サンプルコードを提供します。

ホットリンク保護

カスタム認証アルゴリズム

  • 要件:

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

    • .ts リクエストの場合、以下のホットリンク保護ルールを実装します。

      • ルール 1: t または key パラメーターが不足している場合、HTTP ステータスコード 403 を返し、認証失敗の理由を示す X-AUTH-MSG レスポンスヘッダーを追加します。

      • ルール 2: t パラメーターは絶対有効期限を指定します。t が現在時刻より前の場合、HTTP ステータスコード 403 を返し、認証失敗の理由を示す X-AUTH-MSG レスポンスヘッダーを追加します。

      • ルール 3: md5digest と一致する必要があります。md5digest と一致しない場合、403 レスポンスが返されます。

        md5 の値は、プライベートキー + パス + ファイル名.拡張子 として計算されます。

  • 関連する AScript ルール:

    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)
        }
    
    }

User-Agent ブラックリスト

  • 要件: リクエストの User-Agentijkplayer または Ysten で始まる場合、HTTP ステータスコード 403 を返します。

  • 対応する AScript ルールは以下のとおりです。

    if and($http_user_agent, match_re($http_user_agent, '^(ijkplayer|Ysten).*$')) {
        add_rsp_header('X-BLOCKLIST-DEBUG', 'deny')
        exit(403)
    }

Referer ホワイトリスト

  • 要件: refererhttp[s]://***alibaba.com*** でない場合、HTTP ステータスコード 403 を返します。

  • 対応する AScript ルール:

    if and($http_referer, match_re($http_referer, '^(http|https)://(.)+\.alibaba\.com.*$')) {
        return true
    }
    
    add_rsp_header('X-WHITELIST-DEBUG', 'missing')
    exit(403)

ブラックリストとホワイトリスト

IP ブラックリスト

  • 要件: クライアント IP アドレスが 127.0.0.1 または 10.0.0.1 の場合、HTTP ステータスコード 403 を返します。

  • 対応する AScript ルール:

    if match_re($remote_addr, '127.0.0.1|10.0.0.1') {
        add_rsp_header('X-IPBLOCK-DEBUG', 'hit')
        exit(403)
    }

カスタムリクエスト/レスポンスヘッダー制御

ファイルの自動リネーム

  • 要件: filename クエリパラメーターが存在する場合、ファイル名を filename の値に変更します。それ以外の場合は、デフォルト名を使用します。

  • 対応する AScript ルールは以下のとおりです。

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

    add_rsp_header('Content-Disposition', concat('attachment;filename=', tochar(34), filename, tochar(34)))
    説明
    • HTTP レスポンスに Content-Disposition: attachment レスポンスヘッダーを追加すると、メッセージ本文の強制ダウンロードが行われます。filename パラメーターが存在する場合、ファイルは自動的に filename にリネームされます。それ以外の場合は、デフォルト名が使用されます。

    • filename の値を二重引用符で囲みます。二重引用符の ASCII コードは 34 であり、`tochar` を使用して文字に変換できます。

  • 出力:

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

オリジンレスポンスヘッダーの上書き

  • 要件: オリジンの Content-Type レスポンスヘッダーを上書きします。

  • 対応する AScript ルール:

    add_rsp_header('Content-Type', 'audio/mpeg')

カスタム再書き込みとリダイレクト

正確な URI 再書き込み

  • 要件: ユーザーリクエストの /hello/index.html に再書き込みします。オリジンフェッチとキャッシュされた URI の両方が /index.html になり、クエリパラメーターは変更されないままになります。

  • 対応する AScript ルール:

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

ファイル拡張子の再書き込み

  • 要件: ユーザーリクエストの /1.txt/1.<URL parameter type> に再書き込みします。例えば、/1.txt?type=mp4 はオリジンフェッチとキャッシュのために /1.mp4?type=mp4 になります。

  • 対応する AScript ルール:

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

ファイル拡張子を小文字に変換

  • 要件: URI 全体を小文字に変換します。

  • 対応する AScript ルールは以下のとおりです。

    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 に再書き込みします。

  • 対応する AScript ルールは以下のとおりです。

    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 リダイレクトを実行します。

  • 対応する AScript ルールは以下のとおりです。

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

HTTPS への 302 リダイレクト

  • 要件:

    ルートディレクトリパターン ^/$ に一致する以下の URI をリダイレクトします。

    • http://rtmp.cdnpe.com

    • https://rtmp.cdnpe.com

    https://aliyun.com にリダイレクトします。必要に応じて、リダイレクト先 URI を指定できます。

  • 対応する AScript ルールは以下のとおりです。

    if eq($uri, '/') {
        rewrite('https://aliyun.com', 'redirect')
    }

URL リダイレクト (URI パラメーターなし)

  • 要件: www.test.com へのリクエストを、元の URI パラメーターを保持せずに www.example.com にリダイレクトします。

  • 対応する AScript ルールは以下のとおりです。

    if and(eq(req_header('Host'), 'www.test.com')) {
        rewrite('www.example.com', 'redirect')
    }

    結果: リダイレクト後、URI パラメーターは失われますが、URI の末尾に疑問符が残ります。

末尾の疑問符の削除

  • 対応する AScript ルールは以下のとおりです。

    if and(eq(req_header('Host'), 'www.test.com')) {
        rewrite('www.example.com', 'enhance_redirect')
    }

URL リダイレクト (URI パラメーターあり)

  • 要件: www.test.com へのリクエストを、元の URI パラメーターを保持したまま www.example.com にリダイレクトします。

  • 対応する AScript ルール:

    if and(eq(req_header('Host'), 'www.test.com')) {
        rewrite(concat('www.example.com', $uri), 'enhance_redirect')
    }

ワイルドカードドメイン名に対する正規表現マッチング (URI サフィックスの追加)

  • 要件: ビジネスで複数のドメイン名を使用している場合、正規表現マッチングを使用してワイルドカードドメイン名を識別し、特定の URI サフィックスパラメーターを追加することで、構成作業を削減できます。

  • 対応する AScript ルール:

    host_re = match_re(req_header('Host'), '.*.test.com')
    url_match = null(find($uri, 'index.php'))
    if and(host_re, url_match) {
        rewrite(concat($host, '/index.php?s=', $uri), 'enhance_redirect')
    }

HTTP から HTTPS へのリダイレクト (クエリパラメーターの削除)

  • 要件: http://www.test.com/tmp/?a=bhttps://www.test.com にリダイレクトし、リクエストからすべてのクエリパラメーターを削除します。

  • 対応する AScript ルール:

    host_re = match_re(req_header('Host'), 'www.test.com')
    url_match = not(null(find($request_uri, '?')))  # 無限リダイレクトの防止
    if req_scheme('http') {
        if and(host_re, url_match) {
            rewrite('https://www.test.com', 'enhance_redirect')  # ステータスコード 302
        }
    }

トラブルシューティング

追加 x-request-id

  • 要件: AScript を使用して x-request-id の値を生成し、リクエストとレスポンスの両方に追加することで、リクエストの追跡とトラブルシューティングを簡素化します。

  • 対応する AScript ルール:

    requestid=md5(concat(rand(1, 10000), now()))
    add_req_header('x-request-id', requestid)
    add_rsp_header('x-request-id', requestid)