通过将内容重写配置文件与 HTTP(S) 虚拟服务关联,可以修改服务器响应正文中的 HTML 内容。可以通过 VMware NSX Advanced Load Balancer CLI 或使用 API 创建内容重写策略,并将其附加到虚拟服务。
内容重写配置文件指定要在服务器响应正文中搜索的一个或多个字符串。该配置文件既不会修改客户端请求,也不会修改服务器标头。可以使用其他功能(例如 DataScript 或策略)修改标头。有关重写响应标头的更多信息,请参见虚拟服务策略下面的 HTTP 响应策略。
在 VMware NSX Advanced Load Balancer 中,修改服务器响应的唯一方法是通过内容重写配置文件。可以在虚拟服务中将内容重写配置文件配置为子字段。该配置文件包含用于匹配和替换响应正文中的字符串的键值对列表。内容重写允许配置以下文字字符串或变量:
在 DataScript 中使用
avi.http.set_reqvar()
定义的字符串或变量。在内部为常见虚拟服务或 HTTP 请求参数(例如
$vs_name
、$vs_ip
、$http_host
、$req_id
等)定义的字符串或变量。
关于搜索
内容重写的计算成本可能很高。因此,建议将搜索和替换限制为必须修改的特定内容类型。rewritable_content_ref 参数用于指定字符串组,其中包含符合条件的内容类型列表。默认情况下,VMware NSX Advanced Load Balancer 配置包括 System-Rewritable-Content-Types 字符串组,这是一个包含常见的基于文本的 HTML MIME 类型(例如 text/html、text/plain 等)的列表。在执行搜索和替换操作时,这确保不会检查 Base64 编码的内容(例如图像)。
搜索是在符合条件的服务器响应的整个正文中进行的,没有长度限制。
如果在单个 HTTP 响应正文中的多个位置找到搜索字符串,则在所有这些位置中替换该字符串。
可以在单个内容重写配置文件中指定多个搜索和替换对。所有这些对都是主动且单独应用的。内容替换不是递归性的。例如,假设一个配置文件搜索“a”并替换为“b”,然后搜索“b”并替换为“c”。仅服务器响应中的现有“b”实例替换为“c”。不会递归检查替换为“b”的“a”实例并将其替换为“c”。因此,在应用这两个对后,服务器响应正文
abca
将重写为bccb
。搜索不区分大小写。
替换字符串类型
可以通过用于指定新字符串的三种方法之一,将找到的字符串替换为新字符串。
文字字符串是用于替换响应正文中的数据的基本文本字符串。
可以将指定的 HTTP 标头中的字符串合并到替换字符串中。请指定标头名称,以将其当前值作为替换字符串。如果标头不存在,则将搜索字符串替换为空数据,实际上从响应中移除搜索字符串。在使用 HTTP 标头时,请将 type 设置为
HTTP_HEADER_VAR
,然后输入要使用的标头名称。可以使用 DataScript 生成替换字符串。请创建新的 DataScript 并将其附加到虚拟服务。它必须使用
avi.http.set_reqvar()
函数以指定新值。例如,调用avi.http.set_reqvar(“key1”, “value1”)
将创建一个名为 key1 的变量,并将其设置为value1
。在内容重写配置文件中,将 type 设置为DATASCRIPT_VAR
,并将该变量设置为key1
。对于每个 HTTP 请求,DataScript 可以根据脚本逻辑唯一地将 DataScript 变量设置为 key1 并为其分配新的值,例如 value1、value2 等。如果没有将任何 DataScript 分配给虚拟服务,并且变量设置为不同的名称,或者未设置任何变量,则内容重写配置文件将搜索到的字符串替换为空数据,实际上从响应中移除搜索到的字符串。
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 个制表符,从而导致 Shell 显示命令行语法。
[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]:
内容重写规则
新的对象模型允许用户配置内容重写规则列表。每个规则具有名称、索引以及要配置的搜索和替换对列表。配置的规则按定义的顺序运行。第一个规则优先于第二个规则,依此类推。
搜索字符串类型 |
在 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}。