ADC

ストリーミング書き換えアクションでの Content-Length ヘッダーの動作

Content-Length ヘッダーは、HTTP リクエストまたはレスポンス内のメッセージの長さ (バイト単位) を示す方法の 1 つです。Content-Length ヘッダーとは別に、次のいずれかの方法でメッセージの長さを指定することもできます。

  • チャンクエンコーディング
  • FIN ターミネーション

ストリーミングプロセスでは、NetScalerは書き換えアクションを処理した後もデータを継続的に送信します。データは継続的に送信され、NetScalerには保持されないため、クライアントに送信されるメッセージの実際の長さは不明です。そのため、Content-Length ヘッダーの正しい値をレスポンスに記載することはできません。

ストリーミング処理をサポートするために、NetScalerの書き換え機能では、メッセージの長さを指定する方法がContent-LengthヘッダーからFINターミネーションに変換されます。変換の一環として、NetScalerはヘッダー名の最初の4文字を再配置することでContent-Lengthヘッダーを壊します。

HTTP では、クライアントは理解できないヘッダーを無視することが予想されます。そのため、クライアントは破損した Content-Length ヘッダー名を認識できないため、ヘッダーを無視します。NetScalerのパフォーマンスを向上させるため、ヘッダーは削除されるのではなく破損されます。削除する代わりにヘッダー名を変更すると、同じバイトの順序が異なる場合でもチェックサムは変更されないため、チェックサムの再計算を回避できます。

たとえば、次の HTTP リクエストを考えてみましょう。

GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; CMDTDF; MS-RTC LM 8)
Accept-Encoding: gzip, deflate
Host: test.example.net
Connection: Keep-Alive
<!--NeedCopy-->

作業シナリオでは、このHTTPリクエストに対するNetScalerとバックエンドサーバー間の応答は次のようになります。

HTTP/1.1 200 OK
Content-Length: 10967
Connection: close
var SERVER_URL = 'https\x3a\x2f\x2ftest.example.net\x2f';
var WEB_SERVER_HOST = 'test.example.net';
<!--NeedCopy-->

ただし、動作していないシナリオでクライアントがNetScalerから受け取る応答は次のとおりです。 Content-Length ヘッダーの名前がntcoent-Lengthに変更されました。

HTTP/1.1 200 OK
ntCoent-Length: 10967
nnCoection: close
var SERVER_URL = 'https\x3a\x2f\x2ftest.example.net\x2f';
var WEB_SERVER_HOST = 'test.example.net';
<!--NeedCopy-->

一般に、クライアントアプリケーションは Content-Length ヘッダー、チャンクエンコーディング、FIN ターミネーションの 3 つのトランザクション方法すべてをサポートします。そのため、Content-Length ヘッダーから FIN ターミネーションに変換しても問題は発生しないはずです。ただし、この変更によりアプリケーションが動作しない場合は、 ストリーミングプロセスを無効にする必要があります

リライトポリシーでストリーミングプロセスを無効にする方法

次のいずれかの方法を使用して、リライトポリシーのストリーミングプロセスを無効にできます。

  1. より高い優先度でバインドされている書き換えポリシーに関連する非ストリーミングアクションを追加します。アクションは、応答を変更しないような方法で行う必要があります。

    次に例を示します:

    add rewrite action non_stream_act replace_all HTTP.RES.BODY(1000000) HTTP.RES.FULL_HEADER -search text("pattern_which_will_not_match_in_body")

    この書き換えアクションの本文の値は、現在のストリーミングアクションが動作している値よりも大きくなければなりません。

  2. ストリーミング設定の代わりに、非ストリーミング設定を使用してください。

    注:

    ストリーミング処理から非ストリーミング処理に移行すると、NetScalerのパフォーマンスに影響する可能性があります。

    たとえば、ストリーミング構成は、次のように非ストリーミング構成に変換できます。

    ストリーミング設定:

    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search text("http")
    
    add policy patset pat_list
    bind policy patset pat_list abcd
    bind policy patset pat_list defg
    
    add rewrite action rw_act_2 replace_all HTTP.RES.BODY(1000) ""replaced_data"" -search patset("pat_list")
    <!--NeedCopy-->
    

    非ストリーミング構成:

    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search regex(re/http/)
    
    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search regex(re/abcd|defg/)
    <!--NeedCopy-->
    
ストリーミング書き換えアクションでの Content-Length ヘッダーの動作