如果遇到阻止其处理 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 当前仅适用于企业许可证套餐。

要编辑自定义错误页面配置文件,请执行以下操作:

  1. NSX Advanced Load Balancer UI 中,导航到 模板 > 错误页面 > 错误页面配置文件 > Custom-Error-Page-Profile

  2. 单击编辑按钮。

  3. 编辑错误页面配置文件子屏幕中,custom-error-page 位置将提供删除和编辑图标。单击编辑图标以修改错误页面的正文。

  4. 单击自定义错误页面旁边的三条虚线,然后单击编辑图标。



  5. 页面正文默认定义了徽标、响应代码、应用程序名称和请求 ID。根据需要编辑 HTML 内容。



  6. 单击保存以更新更改。

将显示默认自定义错误页面,如下所示:



取消对此页面中的行的注释以获取请求 ID 和虚拟服务名称:<! -- 请联系我们的技术支持,并提个请求 ID $request_id 和应用程序名称 $vs_name -->                默认情况下,虚拟服务将引用 Custom-Error-Page-Profile。



返回 JSON 错误页面

可以返回 JSON 格式而不是 HTML 格式的错误页面。目前,仅支持通过 CLI 进行配置。下面显示了三个主要步骤:

  1. 使用 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                                                           |
    +-----------------+----------------------------------------------------------------------------------+
  2. 创建错误页面配置文件:下面说明了如何创建错误页面配置文件,该配置文件引用错误页面正文,并将其与将触发其返回客户端的状态代码相关联。

    [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]: >
  3. 将虚拟服务与错误页面配置文件相关联:假设 VS 的名称为 MyVS。可以通过一个 CLI 命令在虚拟服务和错误配置文件之间建立关联:

    [admin:10-10-26-45]: > configure virtualservice MyVS error_page_profile_ref Json-Error-Profile