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

Server Load Balancer:AScriptの一般的なシナリオ

最終更新日:Sep 20, 2024

このトピックでは、ホットリンク保護、ホワイトリスト、ブラックリスト、リクエストヘッダー、レスポンスヘッダー、書き換え、リダイレクト、リモート認証などの一般的なシナリオでカスタム転送ルールを作成する方法について説明します。 このトピックでは、シナリオのサンプルスクリプトも提供します。

ホットリンク保護

カスタム認証アルゴリズムの設定

次の例は、カスタム認証アルゴリズムを設定する方法を示しています。

  • 要件

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

    • . tsカスタムホットリンク保護を設定するための要件は次のとおりです。

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

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

      • ルール3: md5値をダイジェスト値と比較します。 md5値がdigest値と一致しない場合、HTTP 403ステータスコードが返されます。

        md5値の値の形式: Private key + Path + File name.extension

  • サンプルスクリプト

    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($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-Agentブラックリストを設定する方法を示しています。

  • 要件: リクエストにijkplayerまたはYstenで始まるUser-Agentヘッダーが含まれている場合、HTTPステータスコード403が返されます。

  • サンプルスクリプト

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

Refererホワイトリストの設定

次の例は、Refererホワイトリストを設定する方法を示しています。

  • 要件: リクエストのRefererヘッダーがhttp[s]:// *** alibaba.com *** でない場合、HTTP 403ステータスコードが返されます。

  • サンプルスクリプト

    if and($http_referer, match($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のステータスコードが返されます。

  • サンプルスクリプト

    一致する場合は

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

カスタムリクエストヘッダーとレスポンスヘッダー

ファイルの自動名前変更の設定

次の例は、ファイルの自動名前変更を設定する方法を示しています。

  • 要件: filenameパラメーターが指定されている場合、ファイルはfilenameパラメーターで指定された値に自動的に名前が変更されます。 filenameパラメータが指定されていない場合、デフォルトのファイル名が使用されます。

  • サンプルスクリプト

    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)))
    説明
    • レスポンスヘッダーContent-Disposition:attachmentをHTTPレスポンスに追加して、メッセージ本文を自動的にダウンロードできます。 さらに、応答にfilenameパラメーターが含まれている場合、ファイルは自動的にfilenameの値に名前が変更されます。 応答にfilenameパラメータが含まれていない場合は、デフォルトの名前が使用されます。

    • ASCIIで二重引用符 ("") で囲まれたfilename値は、ToCharを使用して文字列に変換できます。 二重引用符 ("") のASCIIコードは34です。

  • 出力:

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

応答ヘッダーの上書き

次の例は、レスポンスヘッダーを上書きする方法を示しています。

  • 要件: レスポンスヘッダーContent-Typを上書きします。

  • サンプルスクリプト

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

カスタム書き換えとリダイレクト

URIの書き換え

次の例は、URIを書き換える方法を示しています。

  • 要件: ユーザーリクエストの /hello/index.htmlに書き換えます。 その結果、back-to-originリクエストのURIとキャッシュされたURIが /index.htmlに変更されます。 他のパラメータは変わらない。

  • サンプルスクリプト

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

ファイル拡張子の書き換え

次の例は、ファイル拡張子を書き換える方法を示しています。

  • 要件: /1.txt/1.<URLパラメータータイプ> に書き換えます。 たとえば、/1.txt? type=mp4は、back-to-originリクエストで /1.mp4?type=mp4に書き換えられ、キャッシュされます。

  • サンプルスクリプト

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

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

次の例は、ファイル拡張子を小文字に変換する方法を示しています。

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

  • サンプルスクリプト

    pcs = capture($uri, '^(.+%.)([^.]+)')
    section = get(pcs, 1)
    postfix = get(pcs, 2)
    
    if and(section, postfix) {
        rewrite(concat(section, lower(postfix)), 'break')
    }

URIプレフィックスの追加

次の例は、URIプレフィックスを追加する方法を示しています。

  • 要件: ユーザーリクエストの ^/nn_live/(.*)/3rd/nn_live/$1に書き換えます。

  • サンプルスクリプト

    pcs = capture($uri, '^/nn_live/(.*)')
    sec = get(pcs, 1)
    
    if sec {
         dst = concat('/3rd/nn_live/', sec)
         rewrite(dst, 'break')
    }

302リダイレクトの実行

次の例は、302リダイレクトを実行する方法を示しています。

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

  • サンプルスクリプト

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

HTTPSへの302リダイレクトの実行

次の例は、HTTPSへの302リダイレクトを実行する方法を示しています。

  • 要件

    ^/$ のルートディレクトリに一致する次のURIを https://aliyun.com にリダイレクトします。

    • http://rtmp.cdnpe.com

    • https://rtmp.cdnpe.com

    ビジネス要件に基づいて、リダイレクト先のURIをカスタム値に置き換えることができます。

  • サンプルスクリプト

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