ADC

HTTP コールアウトの再帰を回避

NetScalerアプライアンスはHTTPコールアウトリクエストの有効性をチェックしませんが、リクエストをHTTPコールアウトエージェントに送信する前にリクエストを一度解析します。この解析により、アプライアンスはコールアウトリクエストを他の着信リクエストと同様に扱うことができるため、コールアウトリクエストを処理するようにいくつかの便利なNetScaler機能(統合キャッシュなど)を構成できます。

ただし、この解析中、HTTP コールアウト要求は同じポリシーを選択し、それ自体を再帰的に呼び出すことができます。アプライアンスは再帰呼び出しを検出し、未定義(UNDEF)条件を発生させます。ただし、再帰呼び出しにより、ポリシーおよび HTTP コールアウト選択カウンタは、それぞれ 1 カウントではなく、2 カウントずつ増加します。

コールアウトが自身を呼び出さないようにするには、HTTPコールアウト・リクエストの一意の特性を少なくとも1つ特定し、この特性を持つすべてのリクエストを、コールアウトを呼び出すポリシールールによって処理されないようにする必要があります。そのためには、ポリシールールに別の Advanced ポリシー式を含めます。SYS.HTTP_CALLOUT(<name>)式は、コールアウト式が評価される前に評価されるように、式の前に式を付ける必要があります。例:

<Expression that prevents callout recursion> OR SYS.HTTP_CALLOUT(<name>)
<!--NeedCopy-->

この方法でポリシールールを設定すると、アプライアンスが要求を生成して解析すると、複合ルールは FALSE と評価され、コールアウトは 2 回目に生成されず、選択カウンタが正しく増分されます。

HTTP コールアウト要求に一意の特性を割り当てる 1 つの方法は、コールアウトを設定するときに一意のカスタム HTTP ヘッダーを含めることです。以下は、「MyCallout」と呼ばれる HTTP コールアウトの例です。コールアウトは、クライアントの IP アドレスがブラックリストに登録された IP アドレスのデータベースに存在するかどうかをチェックする HTTP 要求を生成します。コールアウトには「Request」というカスタムヘッダーが含まれ、値「Callout Request」に設定されています。グローバルにバインドされたレスポンダーポリシー「Pol1」は HTTP コールアウトを呼び出しますが、Request ヘッダーがこの値に設定されているすべてのリクエストを除外します。これにより、myCallout の 2 回目の呼び出しが防止されます。2回目の呼び出しを防ぐ式は、HTTP.REQ.HEADER(“Request”).EQ(“Callout Request”).NOTです。

> add policy httpCallout myCallout
 Done

> set policy httpCallout myCallout -IPAddress 10.102.3.95 -port 80 -returnType TEXT -hostExpr ""10.102.3.95"" -urlStemExpr ""/cgi-bin/check_clnt_from_database.pl"" -headers Request("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(100)"
Done

> add responder policy Pol1 "HTTP.REQ.HEADER("Request").EQ("Callout Request").NOT && SYS.HTTP_CALLOUT(myCallout).CONTAINS("IP Matched")" RESET
Done

> bind responder global Pol1 100 END -type OVERRIDE
Done
<!--NeedCopy-->

注: リクエスト URL に HTTP コールアウト用に設定されたステム式が含まれているかどうかを確認する式を設定することもできます。このソリューションを実装するには、HTTP コールアウトエージェントが HTTP コールアウトにのみ応答でき、アプライアンスを介して送信される他の要求には応答できないようにします。HTTP コールアウトエージェントが他のクライアント要求を処理するアプリケーションまたは Web サーバーである場合、そのような式により、アプライアンスはそれらのクライアント要求を処理できません。代わりに、前述のように一意のカスタムヘッダーを使用します。

HTTP コールアウトの再帰を回避

この記事の概要