如果遇到阻止其处理 HTTP 请求或响应的错误,NSX Advanced Load Balancer 会向客户端返回一条包含状态代码的一般错误消息。本节介绍了如何自定义此错误消息。
自定义的错误响应页面与服务器返回错误页面时 NSX Advanced Load Balancer 使用 DataScript 或策略返回自定义网页不同。
NSX Advanced Load Balancer 会根据以下列出的条件生成错误页面:
由于 Web 应用程序防火墙 (WAF) 策略匹配,请求被阻止。
HTTP 请求或响应解析错误,例如,无效的请求。
后端服务器握手失败或连接超时。
DataScript 中的逻辑故障。
池失败操作
如果所有服务器都关闭,并且池服务器无法返回页面,则可以将池配置为返回自定义错误页面。
导航到编辑以编辑池。在高级选项卡中的池故障设置下,将池失败操作设置为 HTTP 本地响应。在状态代码下设置所需的返回代码,还可以在上载文件字段中选择上载 HTML 文件。
,然后单击默认情况下,池失败操作设置为关闭连接,并将 TCP 重置发送到客户端。此操作在收到 HTTP 请求后以及响应之前生效。例如,客户端请求触发的 WAF 安全冲突具有高优先级。WAF 会发出 403 错误页面,而不是由池失败操作发送的页面。
DataScript
DataScript 用于向客户端返回自定义错误消息。为此,DataScript 需要检测到错误。
自定义错误页面 DataScript 由 RESP_FAILED
事件触发,NSX Advanced Load Balancer 无法处理事务,并向客户端返回页面时会出现这种情况。
仅当 NSX Advanced Load Balancer 生成错误时,才会执行此事件。
如果错误是由服务器生成的,例如 503(服务不可用)响应,DataScript 必须使用 HTTP_RESP
事件覆盖服务器返回的页面。avi.http.internal_status()
函数将返回此错误的原因。此信息嵌入在返回的自定义错误页面中。然后,通过将自定义 HTML 嵌入到 avi.http.response()
函数中,将响应发送到客户端。或者,也可以通过 avi.http.redirect()
使用 HTTP 重定向。
-- RESP_FAILED status = avi.http.internal_status() html = "Your request could not be completed. Please contact support." if status then html = html .. " Reason: " .. status end html = html .. "" avi.http.response(503, {content_type="text/html"}, html)
错误页面配置文件
您可以在 NSX Advanced Load Balancer 上配置一个或多个自定义错误页面。导航到 ,然后单击创建。
这些页面是在错误页面正文中定义的简单 HTML 页面。错误页面配置文件可以指向多个错误页面正文。确保每个错误页面配置文件都与不同的 HTTP 状态代码或一系列状态代码相关联。
自定义令牌或变量是由 NSX Advanced Load Balancer 生成的动态数据,可以插入到返回页面中。这些变量前后必须用空格分隔。NSX Advanced Load Balancer 分析器将拒绝错误页面的 HTML 中包含的其他字符串 ($) 字符。以下是可用变量:
$status – 返回 NSX Advanced Load Balancer 返回到客户端的状态代码。
$request_id – 返回 NSX Advanced Load Balancer 分配给特定请求或响应的唯一标识符。日志中也包含此标识符。将此标识符返回到客户端时,可以在日志中查找特定事务以找到错误原因。一个常见用例是 WAF,它可以阻止根据广泛的违规行为阻止客户端请求。通过在日志中找到请求 ID,管理员可以验证是否必须免除阻止的请求或 WAF 特征码,以免阻止将来的请求。
$vs_name – 返回虚拟服务的名称。此名称可以不同于连接的 FQDN 客户端。
可以将样式表、JavaScript 或 base64 编码图像作为内嵌对象嵌入到单个 HTML 文件中,以便生成可靠的错误页面。或者,HTML 页面也可以包含指向另一个站点的链接,以检索这些附加对象。
自定义错误页面配置文件
对于 NSX Advanced Load Balancer 生成的 4xx 和 5xx 错误,每项虚拟服务都有一个用户定义的 HTML 错误页面 (Custom-Error-Page-Profile)。
您可以根据需要更新或添加特定的错误页面配置文件和页面。
Custom-Error-Page (HTML) 打包在控制器中。此页面大小约为 4 KB。
Custom-Error-Page-Profile 当前仅适用于企业许可证套餐。
要编辑自定义错误页面配置文件,请执行以下操作:
-
从 NSX Advanced Load Balancer UI 中,导航到 。
单击编辑按钮。
在编辑错误页面配置文件子屏幕中,custom-error-page 位置将提供删除和编辑图标。单击编辑图标以修改错误页面的正文。
单击自定义错误页面旁边的三条虚线,然后单击编辑图标。
页面正文默认定义了徽标、响应代码、应用程序名称和请求 ID。根据需要编辑 HTML 内容。
单击保存以更新更改。
将显示默认自定义错误页面,如下所示:
取消对此页面中的行的注释以获取请求 ID 和虚拟服务名称:<! -- 请联系我们的技术支持,并提个请求 ID $request_id 和应用程序名称 $vs_name --> 默认情况下,虚拟服务将引用 Custom-Error-Page-Profile。
返回 JSON 错误页面
可以返回 JSON 格式而不是 HTML 格式的错误页面。目前,仅支持通过 CLI 进行配置。下面显示了三个主要步骤:
使用 configure 命令创建错误页面正文。
[admin:10-10-26-45]: > configure errorpagebody Json-Error-Page-Body [admin:10-10-26-45]: errorpagebody> format error_page_format_json [admin:10-10-26-45]: errorpagebody> error_page_body -- Please input the value for field error_page_body (Enter END to terminate input):"{ \"request_id\":\" $request_id \", \"application_name\":\" $vs_name \", \"status_code\":\" $status \" }" END [admin:10-10-26-45]: errorpagebody> save +-----------------+----------------------------------------------------------------------------------+ | Field | Value | +-----------------+----------------------------------------------------------------------------------+ | uuid | errorpagebody-6a0ee492-30bc-41fc-8105-ec6166f7ae04 | | name | Json-Error-Page-Body | | tenant_ref | admin | | error_page_body | "{ \"request_id\":\" $request_id \", \"application_name\":\" $vs_name \", \"stat | | | us_code\":\" $status \" }" | | format | ERROR_PAGE_FORMAT_JSON | +-----------------+----------------------------------------------------------------------------------+
创建错误页面配置文件:下面说明了如何创建错误页面配置文件,该配置文件引用错误页面正文,并将其与将触发其返回客户端的状态代码相关联。
[admin:10-10-26-45]: > configure errorpageprofile Json-Error-Profile [admin:10-10-26-45]: errorpageprofile> error_pages index 0 New object being created [admin:10-10-26-45]: errorpageprofile:error_pages> enable [admin:10-10-26-45]: errorpageprofile:error_pages> match match_criteria is_in status_codes 503 [admin:10-10-26-45]: errorpageprofile:error_pages:match> save [admin:10-10-26-45]: errorpageprofile:error_pages> error_page_body_ref Json-Error-Page-Body [admin:10-10-26-45]: errorpageprofile:error_pages> save [admin:10-10-26-45]: errorpageprofile> save +-----------------------+-------------------------------------------------------+ | Field | Value | +-----------------------+-------------------------------------------------------+ | uuid | errorpageprofile-f8381196-ab7e-4716-96c6-ad99db8beb41 | | name | Json-Error-Profile | | tenant_ref | admin | | error_pages[1] | | | index | 0 | | enable | True | | match | | | match_criteria | IS_IN | | status_codes[1] | 503 | | error_page_body_ref | Json-Error-Page-Body | +-----------------------+-------------------------------------------------------+ [admin:10-10-26-45]: >
将虚拟服务与错误页面配置文件相关联:假设 VS 的名称为
MyVS
。可以通过一个 CLI 命令在虚拟服务和错误配置文件之间建立关联:[admin:10-10-26-45]: > configure virtualservice MyVS error_page_profile_ref Json-Error-Profile