コンテンツ書き換えプロファイルを HTTP(S) 仮想サービスに関連付けることで、サーバ応答の本文内で HTML コンテンツを変更できます。コンテンツ書き換えポリシーの作成と仮想サービスへの接続には、VMware NSX Advanced Load Balancer CLI によってもも API を使用してもよいです。
コンテンツ書き換えプロファイルは、サーバ応答の本文内で検索する 1 つ以上の文字列を指定します。プロファイルは、クライアント要求もサーバ ヘッダーも変更しません。ヘッダーは、DataScript やポリシーなどの他の機能を使用して変更できます。応答ヘッダーの書き換えの詳細については、「仮想サービス ポリシー」の「HTTP 応答ポリシー」を参照してください。
VMware NSX Advanced Load Balancer でサーバ応答を変更する唯一の方法は、コンテンツ書き換えプロファイルです。コンテンツ書き換えプロファイルは、仮想サービスのサブフィールドとして構成できます。プロファイルには、応答本文内の文字列に一致して置き換えるキーと値のペアのリストが含まれています。Content-rewrite を使用すると、リテラル文字列または次のいずれかの変数を構成できます。
avi.http.set_reqvar()
を使用して DataScript で定義されるもの。一般的な仮想サービスや HTTP 要求パラメータ(
$vs_name
、$vs_ip
、$http_host
、$req_id
など)に対して内部的に定義されるもの。
検索について
コンテンツの書き換えは計算コストが高くなる可能性があります。そのため、検索の置き換えを変更する必要がある特定のコンテンツ タイプに制限することをお勧めします。Rewritable_content_ref 引数は、その特定のコンテンツ タイプのリストを含める文字列グループを指定するに使用されます。デフォルトでは、VMware NSX Advanced Load Balancer の構成に System-Rewritable-Content-Types 文字列グループを含めます。内容は、text/html や text/plain など一般的なテキストベースの HTML MIME タイプのリストです。これにより、検索/置換操作を実行するときに、イメージなどの base64 でエンコードされたコンテンツが検査されなくなります。
検索は、対象となるサーバ応答の本文全体にわたって実行され、長さの制限はありません。
1 つの HTTP 応答本文内の複数の場所に検索文字列が見つかった場合は、それらのすべての場所で置き換えられます。
1 つのコンテンツ書き換えプロファイルで複数の検索/置換ペアを指定できます。これらはすべてアクティブかつ独立して適用されます。コンテンツの置き換えは再帰的ではありません。たとえば、「a」を「b」に検索置換し、「b」を「c」に置き換える 2 つ目の search-replace を持つプロファイルについて考えます。サーバ応答内の「b」の既存のインスタンスのみが「c」に置き換えられます。「b」に置き換えられた「a」のインスタンスは再帰的にチェックされず、「c」に置き換えられます。したがって、両方のペアが適用されると、サーバ応答本文
abca
はbccb
に書き換えられます。検索では大文字/小文字は区別されません。
置換文字列タイプ
見つかった文字列は、新しい文字列を指定するために使用される 3 つの方法のいずれかで新しい文字列に置き換えることができます。
リテラル文字列は、応答本文で見つかったデータを置き換える際に使用される基本的なテキスト文字列です。
識別された HTTP ヘッダー内の文字列は、置換文字列に組み込むことができます。ヘッダー名を指定して、現在の値を置換文字列として使用します。ヘッダーが存在しない場合、検索文字列は null データに置き換えられ、事実上応答から検索文字列が削除されます。[HTTP ヘッダー] を使用する場合は、[タイプ] を
HTTP_HEADER_VAR
に設定してから、使用するヘッダーの名前を入力します。DataScript を使用して置換文字列を生成できます。新しい DataScript を作成して仮想サービスに接続します。ここで新しい値を指定するには、
avi.http.set_reqvar()
関数を使用することになります。たとえば、avi.http.set_reqvar(“key1”, “value1”)
という命令では、key1 という名前の変数が作成され、value1
に設定されます。[コンテンツ書き換えプロファイル] で、タイプをDATASCRIPT_VAR
に設定し、変数をkey1
に設定します。各 HTTP 要求の DataScript で、DataScript 変数を key1 と一意に設定することで、スクリプト ロジックに基づいて value1、value2 といった新しい値を割り当てることができます。仮想サービスに DataScript が割り当てられていない場合、変数が別の名前に設定されている場合、または変数が設定されていない場合、コンテンツ書き換えプロファイルは検索された文字列を null データに置き換え、事実上検索文字列を応答から削除します。
CLI インターフェイス
この後に示すターミナルで着目されたいのは、VS3 という名前の仮想サービス オブジェクト内にある次の操作フィールドです。
content_rewrite.rewritable_content_ref
。content_rewrite.request_rewrite_enabled
。content_rewrite.response_rewrite_enabled
。content_rewrite.rsp_match_replace_pair.match_string
。content_rewrite.rsp_match_replace_pair.replacement_string.type
。content_rewrite.rsp_match_replace_pair.replacement_string.val
。
下のターミナルに [TAB][TAB] を挿入して、ユーザーの 2 つのタブの入力を示しました。これにより、シェルでコマンドライン構文が表示されます。
[admin:10-160-0-3]: > configure virtualservice VS3 Updating an existing object. Currently, the object is: +----------------------------------+-----------------------------------------------------+ | Field | Value | +----------------------------------+-----------------------------------------------------+ | uuid | virtualservice-d49aff8a-2846-457b-98c7-657c18675b0e | | name | VS3 | | enabled | True | | services[1] | | | port | 80 | | enable_ssl | False | | port_range_end | 80 | | application_profile_ref | System-HTTP | | network_profile_ref | System-TCP-Proxy | | pool_ref | VS3-pool | | se_group_ref | Default-Group | | network_security_policy_ref | vs-VS3-Default-Cloud-ns | | analytics_policy | | | full_client_logs | | | enabled | True | | duration | 30 min | | all_headers | False | | client_insights | ACTIVE | | metrics_realtime_update | | | | enabled | True | | duration | 30 min | | vrf_context_ref | global | | enable_autogw | True | | analytics_profile_ref | System-Analytics-Profile | | weight | 1 | | delay_fairness | False | | max_cps_per_client | 0 | | limit_doser | False | | type | VS_TYPE_NORMAL | | cloud_type | CLOUD_NONE | | use_bridge_ip_as_vip | False | | flow_dist | LOAD_AWARE | | ign_pool_net_reach | False | | ssl_sess_cache_avg_size | 1024 | | remove_listening_port_on_vs_down | False | | tenant_ref | admin | | cloud_ref | Default-Cloud | | east_west_placement | False | | scaleout_ecmp | False | | active_standby_se_tag | ACTIVE_STANDBY_SE_1 | | flow_label_type | NO_LABEL | | content_rewrite | | | rewritable_content_ref | System-Rewritable-Content-Types | | request_rewrite_enabled | False | | response_rewrite_enabled | False | | sideband_profile | | | sideband_max_request_body_size | 1024 bytes | | vip[1] | | | vip_id | 1 | | ip_address | 10.160.33.200 | | enabled | True | | auto_allocate_ip | False | | auto_allocate_floating_ip | False | | avi_allocated_vip | False | | avi_allocated_fip | False | | vsvip_ref | vsvip-VS3-Default-Cloud | +----------------------------------+-----------------------------------------------------+ [admin:10-160-0-3]: virtualservice> content_rewrite [admin:10-160-0-3]: virtualservice:content_rewrite> where Tenant: admin +--------------------------+---------------------------------+ | Field | Value | +--------------------------+---------------------------------+ | rewritable_content_ref | System-Rewritable-Content-Types | | request_rewrite_enabled | False | | response_rewrite_enabled | False | +--------------------------+---------------------------------+ [admin:10-160-0-3]: virtualservice:content_rewrite> response_rewrite_enabled [TAB][TAB] request_rewrite_enabled Enable rewrite on request body. rewritable_content_ref Rewrite only content types listed in this string group. Content types not present in this list are not rewritten. [admin:10-160-0-3]: virtualservice:content_rewrite> response_rewrite_enabled Overwriting the previously entered value for response_rewrite_enabled [admin:10-160-0-3]: virtualservice:content_rewrite> where Tenant: admin +--------------------------+---------------------------------+ | Field | Value | +--------------------------+---------------------------------+ | rewritable_content_ref | System-Rewritable-Content-Types | | request_rewrite_enabled | False | | response_rewrite_enabled | True | +--------------------------+---------------------------------+ [admin:10-160-0-3]: virtualservice:content_rewrite> rsp_match_replace_pair New object being created [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair> where Tenant: admin No result. [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair> match_string ABC [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair> replacement_string [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair:replacement_string> type [TAB][TAB] datascript_var The variable exposed in datascript to be used as the replacement string in content rewrite. http_header_var The HTTP header to be used as the replacement string in content rewrite. literal_string The literal string to be used as the replacement string in content rewrite. [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair:replacement_string> type literal_string [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair:replacement_string> val XYZ [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair:replacement_string> save [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair> where Tenant: admin +--------------------+----------------+ | Field | Value | +--------------------+----------------+ | match_string | ABC | | replacement_string | | | type | LITERAL_STRING | | val | XYZ | +--------------------+----------------+ [admin:10-160-0-3]: virtualservice:content_rewrite:rsp_match_replace_pair> save [admin:10-160-0-3]: virtualservice:content_rewrite> save [admin:10-160-0-3]: virtualservice> save +----------------------------------+------------------------------------------------------+ | Field | Value | +----------------------------------+------------------------------------------------------+ | uuid | virtualservice-d49aff8a-2846-457b-98c7-657c18675b0e | | name | VS3 | | enabled | True | | services[1] | | | port | 80 | | enable_ssl | False | | port_range_end | 80 | | application_profile_ref | System-HTTP | | network_profile_ref | System-TCP-Proxy | | pool_ref | VS3-pool | | se_group_ref | Default-Group | | network_security_policy_ref | vs-VS3-Default-Cloud-ns | | analytics_policy | | | full_client_logs | | | enabled | True | | duration | 30 min | | all_headers | False | | client_insights | ACTIVE | | metrics_realtime_update | | | enabled | True | | duration | 30 min | | vrf_context_ref | global | | enable_autogw | True | | analytics_profile_ref | System-Analytics-Profile | | weight | 1 | | delay_fairness | False | | max_cps_per_client | 0 | | limit_doser | False | | type | VS_TYPE_NORMAL | | cloud_type | CLOUD_NONE | | use_bridge_ip_as_vip | False | | flow_dist | LOAD_AWARE | | ign_pool_net_reach | False | | ssl_sess_cache_avg_size | 1024 | | remove_listening_port_on_vs_down | False | | tenant_ref | admin | | cloud_ref | Default-Cloud | | east_west_placement | False | | scaleout_ecmp | False | | active_standby_se_tag | ACTIVE_STANDBY_SE_1 | | flow_label_type | NO_LABEL | | content_rewrite | | |rewritable_content_ref | System-Rewritable-Content-Types | |request_rewrite_enabled | False | |response_rewrite_enabled | True | |rsp_match_replace_pair[1] | | |match_string | ABC | |replacement_string | | | type | LITERAL_STRING | | val | XYZ | | sideband_profile | | | sideband_max_request_body_size | 1024 bytes | | vip[1] | | | vip_id | 1 | | ip_address | 10.160.33.200 | | enabled | True | | auto_allocate_ip | False | | auto_allocate_floating_ip | False | | avi_allocated_vip | False | | avi_allocated_fip | False | | vsvip_ref | vsvip-VS3-Default-Cloud | +----------------------------------+----------------------------------------------------- +
仮想サービスのコンテンツ書き換えプロファイル構成を表示するには、次の手順を実行します。
[admin:10-160-0-8]: show virtualservice virtualservice-1 +----------------------------------+---------------------------------------------------------------------------------+ | Field | Value | +----------------------------------+---------------------------------------------------------------------------------+ |uuid | virtualservice-80519ed3-00f8-437d-9b4e-66c12f331f60 | |name | virtualservice-1 | |enabled | True | |services[1] | | |port | 9000 | |enable_ssl | False | |port_range_end | 9000 | |services[2] | | |port | 9443 | |enable_ssl | True | |port_range_end | 9443 | |application_profile_ref | applicationprofile-1 | |network_profile_ref | System-TCP-Proxy | |pool_ref | pool-1 | |se_group_ref | Default-Group | |ssl_key_and_certificate_refs[1] | System-Default-Cert-EC | |ssl_profile_ref | System-Standard | |analytics_policy | | |full_client_logs | | |enabled | True | |duration | 0 min | |throttle | 0 per_second | |client_insights | NO_INSIGHTS | |all_headers | True | |metrics_realtime_update | | |enabled | True | |duration |0 min | |udf_log_throttle |0 per_second | |significant_log_throttle |0 per_second | |enabled |True | |vrf_context_ref |global | |enable_autogw |True | |analytics_profile_ref |System-Analytics-Profile | |vs_datascripts[1] | | |index | 0 | |vs_datascript_set_ref | vsds1-0 | |weight | 1 | |delay_fairness | False | |max_cps_per_client | 0 | |limit_doser | False | |type | VS_TYPE_NORMAL | |cloud_type | CLOUD_NONE | |use_bridge_ip_as_vip | False | |flow_dist | CONSISTENT_HASH_SOURCE_IP_ADDRESS_AND_PORT | |ign_pool_net_reach | False | |ssl_sess_cache_avg_size | 1024 | | remove_listening_port_on_vs_down | False | |close_client_conn_on_config_update| False | |bulk_sync_kvcache | False | |tenant_ref | admin | | cloud_ref | Default-Cloud | | east_west_placement | False | | scaleout_ecmp | False | | active_standby_se_tag | ACTIVE_STANDBY_SE_1 | | flow_label_type | NO_LABEL | | content_rewrite | | | rewritable_content_ref | sg-1 | | request_rewrite_enabled | False | | response_rewrite_enabled | True | | rsp_match_replace_pair[1] | | | match_string | The Big Picture | | replacement_string | | | type | LITERAL_STRING | | val | The Bigger Picture | | rsp_match_replace_pair[2] | | | match_string | abankerisafellowwholendsyouhisumbrellawhenthesunisshining | |replacement_string | | |type | LITERAL_STRING | |VAL | ABANKERISAFELLOWWHOLENDSYOUHISUMBRELLAWHENTHESUNISSHINING | |rsp_match_replace_pair[3] | | | match_string | literal | |replacement_string | | | type | LITERAL_STRING | | val | blah | | rsp_match_replace_pair[4] | | | match_string | httpvar | | replacement_string | | |type | HTTP_HEADER_VAR | | val | http_host | | match_string | datascriptvar | | replacement_string | | | type | DATASCRIPT_VAR | | val | modified_hostname | | rsp_match_replace_pair[6] | | | match_string | fghijkl | | replacement_string | | | type | HTTP_HEADER_VAR | | val | http_host | | rsp_match_replace_pair[7] | | | match_string | datascript_some_var | | replacement_string | | | type | DATASCRIPT_VAR | | val | some_var | | rsp_match_replace_pair[8] | | | match_string | integer_variable | | replacement_string | | | type | DATASCRIPT_VAR | | val | int_variable | | rsp_match_replace_pair[9] | | | match_string | true_var | | replacement_string | | | type | DATASCRIPT_VAR | | val | true_variable | | rsp_match_replace_pair[10] | | | match_string | false_var | | replacement_string | | | type | DATASCRIPT_VAR | | val | false_variable | | rsp_match_replace_pair[11] | | | match_string | unset_var | | replacement_string | | | type | DATASCRIPT_VAR | | val | get_unset | | rsp_match_replace_pair[12] | | | match_string | variable1 | | replacement_string | | | type | DATASCRIPT_VAR | | val | multi_var1 | | rsp_match_replace_pair[13] | | | match_string | small_match | | replacement_string | | | type | LITERAL_STRING | | val | abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVQXYZ 9876543210 ABCD| | | EFGHIJKLMNOPQRSTUVQXYZ 0123456789 9876543210_abcdefghijk | | rsp_match_replace_pair[14] | | | match_string | ZYXWVUTSRQPONMLKJIHGFEDCBA_9876543210_0123456789_zyxwvutsrqponmlkjihgfedcba_The | | | quick brown fox jumps over the lazy dog_Pack my box with five dozen liquor jugs.| | replacement_string | | | type | DATASCRIPT_VAR | | val | modified_hostname | | rsp_match_replace_pair[15] | | | match_string | nginx | | replacement_string | | | type | LITERAL_STRING | | val | content rewrite | | rsp_match_replace_pair[16] | | | match_string | apache | | replacement_string | | | type | LITERAL_STRING | | val | NGINX | | rsp_match_replace_pair[17] | | | match_string | FEDORA | | replacement_string | | | type | LITERAL_STRING | | val | Ubuntu | | rsp_match_replace_pair[18] | | | match_string | SerVer | | replacement_string | | | type | LITERAL_STRING | | val | backend | | rsp_match_replace_pair[19] | | | match_string | SSL_VERSION_TLS1_1 | | replacement_string | | | type | LITERAL_STRING | | val | SSL_VERSION_TLS1_2 | | rsp_match_replace_pair[20] | | | match_string | Gambardella | | replacement_string | | | type | LITERAL_STRING | | val | alledrabmaG | | rsp_match_replace_pair[21] | | | match_string | ztoa | | replacement_string | | | type | LITERAL_STRING | | val | ZTOA | | vip[1] | | | vip_id | 0 | | ip_address | 10.160.35.63 | | enabled | True | | auto_allocate_ip | False | | auto_allocate_floating_ip | False | | avi_allocated_vip | False | | avi_allocated_fip | False | | auto_allocate_ip_type | V4_ONLY | | vsvip_ref | vsvip-beK7uc | | use_vip_as_snat | False | | traffic_enabled | True | +--------------------------------------------------------------------------------------------------------------------+ [admin:10-160-0-8]:
コンテンツ書き換えルール
新しいオブジェクト モデルにより、ユーザーはコンテンツの書き換えルールのリストを構成できます。各ルールには、名前、インデックス、および構成する検索と置換のペアのリストがあります。構成されたルールは、定義された順序で実行されます。最初のルールは 2 番目のルールよりも優先され、残りのルールは後に続きます。
文字列タイプの検索 |
VMware NSX Advanced Load Balancer では、さまざまなタイプの文字列を検索できます。これらの型は、置換文字列の文字列型と似ています。次の文字列を検索できます。
|
新しい文字列タイプの置き換え。 |
[組み合わせ文字列] からも、変数 |
ペアの検索と置き換えの例
例 1(応答内の user-agent のすべてのインスタンスを文字列「NSX」に置き換えます)
SearchReplacePair:
search_string:
type: SEARCH_HTTP_VAR
val: ${http_user_agent}
replacement_string:
type: LITERAL_STRING
val: NSX
例 2(XML 応答のアドレス タグとポート タグを仮想サービスの IP とポートに置き換えます)
SearchReplacePair #1:
search_string:
type: REGEX_STRING.
val: (<address>)[\s]*([\w\.]*)[\s]*(</address>).
replacement_string:
type: COMBINATION_STRING.
val: ${1}${vs_ip}${3}.
SearchReplacePair #2:
search_string:
type: REGEX_STRING.
val: (<port>)8443(</port>).
replacement_string:
type: COMBINATION_STRING.
val: ${1}${vs_port}${3}.