将消息处理器配置为允许重复的标头

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

根据 HTTP 规范 RFC 7230 第 3.2.2 节:字段顺序,Apigee Edge 期望来自客户端的 HTTP 请求或来自后端服务器的 HTTP 响应不会多次传递同一标头(具有相同或不同的值),除非该特定标头有例外情况并允许重复。

默认情况下,Apigee Edge 允许将重复项和多个值传递给大多数 HTTP 标头。不过,它不允许使用不允许重复和具有多个值的标头中列出的某些标头。因此:

  • 如果客户端发送的 HTTP 请求包含特定标头多次或包含不允许在 Apigee Edge 中包含重复项/多个值的 HTTP 标头的多个值,您将收到错误代码为 protocol.http.DuplicateHeader400 Bad Request
  • 同样,如果后端服务器发送的 HTTP 响应中包含特定标头(在 Apigee Edge 中不允许重复或包含多个值的 HTTP 标头)且该标头出现多次或包含多个值,您将收到 502 Bad Gateway 错误,错误代码为 protocol.http.DuplicateHeader

解决这些错误的推荐解决方案是修复客户端应用和后端服务器,使其不再发送重复的标头,并遵循规范 RFC 7230 第 3.2.2 节:字段顺序,如下面的问题排查剧本中所述:

不过,在某些情况下,您可能需要添加例外情况,以针对某些 HTTP 标头包含重复值和多个值。在这种情况下,您可以在消息处理器级别设置属性 HTTPHeader.HEADER_NAME,以允许特定 HTTP 标头具有重复的标头和多个值。

本文档提供了有关此属性的信息,说明了如何启用此属性以避免上述错误,并分享了有关此属性的最佳实践。

HTTP 标头属性,用于允许重复值和多个值

Apigee Edge 提供以下两个属性来控制允许 HTTP 标头重复和具有多个值的行为。请注意,这些只能在消息处理器上使用 如何配置 Edge 中说明的令牌语法进行配置。

属性名称 说明 允许的值
HTTPHeader.ANY

此属性用于指明是否允许所有 HTTP 标头(包括作为客户端发出的 HTTP 请求或后端服务器发送到 Apigee Edge 的 HTTP 响应的一部分发送的自定义标头)包含重复项或多个值。

默认值

multiValued, allowDuplicates,

  1. blank:不允许使用重复的 HTTP 标头和多个 HTTP 标头值。
  2. multiValued:将多值标头拆分为多个标头。 HTTP 标头允许使用多个值,但不允许使用重复的值。 值 multiValued 已启用,这意味着 test-header=a,b 将转换为 test-header=atest-header=b.
  3. allowDuplicates:允许使用多个(重复)同名 HTTP 标头。
  4. multiValued, allowDuplicates:HTTP 标头允许包含多个值和重复值。

HTTPHeader.HEADER_NAME

此属性用于替换 HTTPHeader.ANY 中指定的特定标头的行为

同上。

不允许重复和包含多个值的标头

如前所述,Apigee Edge 默认允许大多数 HTTP 标头具有重复值和多个值。这是因为属性 HTTPHeader.ANY 配置的值为 multiValued, allowDuplicates.

配置被覆盖

对于某些特定标头,可以使用以下方法之一覆盖默认配置:

  • HTTPHeader.HEADER_NAME=multiValued, allowDuplicates

    此配置不会更改默认行为。 也就是说,特定标头可以有重复值和多个值

    .
  • HTTPHeader.HEADER_NAME=

    此配置会更改默认行为。也就是说,特定标头不允许有重复值和多个值

确定不允许重复和包含多个值的标头

本部分介绍了如何识别以下内容:

  • 不允许在 Apigee Edge Private Cloud 设置中包含重复值和多个值的特定标头 ,以及
  • 具有预先存在配置的特定标头
  1. 在消息处理器机器上,搜索 /opt/apigee/edge-message-processor/conf 目录中的属性 HTTPHeader.,如下所示:

    grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
    

    示例输出

    # grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued
    … <snipped>
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates
    …
    <snipped>
  2. 配置被覆盖部分中所述,请注意上述示例输出中的以下信息:
    1. HTTP 标头 Connection 会被覆盖,但允许重复和包含多个值
    2. HTTP 标头 HostExpires 会被覆盖,不允许重复和包含多个值
    3. HTTP 标头 Date 被覆盖,允许重复,但不允许多个值
    4. 本文档中将此处显示的所有标头(上例中的 ConnectionHostExpiresDate)称为具有预先存在的配置的标头。

Apigee Edge 的行为

下表介绍了在标头以重复形式发送且具有多个值时,Apigee Edge 的行为,具体取决于如何在消息处理器上配置 HTTPHeader 属性,并提供了一个 HTTPHeadertest-header 的示例。

请求 根据 conf/http.properties+HTTPHeader.test-header= 的值传出的标头
<空白> allowDuplicates multiValued allowDuplicates、multiValued(默认)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

在内部,我们将 test-header=a,b 拆分为:

  • test-header=a
  • test-header=b

然后抛出 DuplicateHeader 错误。

test‑header=a,b

在内部,我们将 test-header=a,b 拆分为:

  • test-header=a
  • test-header=b

但随后原始表单会发送到目标。

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

准备工作

在按照本文档中的步骤操作之前,请务必了解如何为 Edge on Private Cloud 配置属性,如 如何配置 Edge 中所述。

为标头配置 allowDuplicates 和多个值

允许重复和多个值的 HTTP 标头属性中所述,属性 HTTPHeader.ANY = allowDuplicates, multiValued 的值表示允许所有标头在 Apigee Edge 中具有重复值和多个值。不过,某些标头的值会被明确覆盖,以防止出现重复标头或多个值,这是通过使用属性 HTTPHeader.HEADER_NAME 来实现的。

本部分介绍如何配置属性 HTTPHeader.HEADER_NAME,以允许消息处理器上任何此类 HTTP 标头出现重复值和多个值,并使用相应的令牌(如如何配置 Edge 中所述的语法)。

在本部分中,我们将使用 Expires(和 myheader)作为示例标头,我们希望允许重复和多个值,如下所述:

  1. 确定属性 HTTPHeaderHEADER_NAME 的当前值,确保它尚未启用以允许重复值和多个值,方法是使用以下命令:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    例如,如果您尝试为 Expires 标头设置属性,请检查消息处理器上属性 HTTPHeader.Expires 令牌的当前值:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    上述命令的输出结果如下之一:

    1. 如果该属性设置为空白,则表示该值会被覆盖(并且这是一个具有预先存在的配置的标头),以不允许重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送 Expires 标头。
    2. 如果未找到特定属性的命中项,则表示该值未 被覆盖(并且这不是具有预先存在的配置的标头)。这意味着,特定标头可以作为发送到 Apigee Edge 的 HTTP 请求或 HTTP 响应的一部分多次发送(允许重复)。
    3. 如果该属性设置为值 allowDuplicates, multiValued,则 表示该值被显式覆盖 (并且这是一个具有 预先存在的配置的标头)。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分多次发送到 Apigee(允许重复)。

    搜索命令的输出示例

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    上述示例输出显示,属性 HTTPHeader.Expires 设置为空白。这意味着,该属性会被覆盖,以不允许标头 出现重复值 或多个值Expires

  2. 如果您发现与特定标头对应的属性被明确覆盖不允许重复或多个值(如上面的示例输出所示),只有在这种情况下才执行以下步骤。如果未明确覆盖,则跳过本部分中的其余步骤。
  3. 修改。如果该目录不存在,您可以创建它:
    /opt/apigee/customer/application/message-processor.properties

    例如,如需使用 vi 打开该文件,请输入以下内容:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. 添加一行,格式如下:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
  5. 保存更改。
  6. 确保属性文件归 apigee 用户所有。 如果不是,请执行以下命令:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. 重启消息处理器:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    如需在不影响流量的情况下重启,请参阅 在不影响流量的情况下滚动重启消息处理器

  8. 如果您有多个消息处理器,请在所有消息处理器上重复执行上述步骤。

验证标头是否配置为具有重复项和多个值

本部分介绍了如何验证特定标头的属性 HTTPHeader.HEADER_NAME 是否已成功更新,以允许在消息处理器上出现重复项。

我们将使用 Expires 作为示例标题,并检查相应的属性 HTTPHeader.Expires 是否已更新。

即使您使用令牌 conf_http_HTTPHeader.Expires 更新了消息处理器的值,您也需要验证实际属性 HTTPHeader.Expires 是否已设置为新值。

  1. 在消息处理器机器上,在 /opt/apigee/edge-message-processor/conf 目录中搜索属性 HTTPHeader.HEADER_NAME,并检查该属性是否已设置为新值,如下所示:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    例如,如果您想检查属性 HTTPHeader.Expires 是否已设置为新值,请运行以下命令:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. 如果成功为消息处理器上的 HTTPHeader.HEADER_NAME 设置了新值,则上述命令会在 http.properties 文件中显示新值。
  3. 在配置 allowDuplicatesmultiValued 后,上述命令的示例结果如下:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
  4. 在上面的示例输出中,请注意,属性 HTTPHeader.Expires 已在 http.properties 中设置为新值 allowDuplicates, multiValued。这表示已在消息处理器上成功配置允许 HTTPHeader 中存在重复值和多个值的行为。
  5. 如果您仍然看到属性 HTTPHeader.HEADER_NAME 的旧值,请验证您是否已正确按照为标头配置 allowDuplicates 和多个值中所述的所有步骤操作。 如果您遗漏了任何步骤,请再次正确重复所有步骤。

    确保您的代理按预期运行,尤其是在代理中存在用于获取和设置标头的功能逻辑时。

  6. 如果您仍然无法修改该属性,请与 Apigee Edge 支持团队联系

针对标头停用 allowDuplicates

本部分介绍如何使用相应令牌(根据如何配置 Edge 中所述的语法)在消息处理器上配置属性 HTTPHeader.{Headername},以不允许特定 HTTP 标头出现重复值和多个值

在本部分中,我们将使用 Expires(和 myheader)作为示例标头,我们不希望允许重复这些标头,如下所述:

  1. 确定属性 HTTPHeaderHEADER_NAME 的当前值 ,确保它尚未被停用,以允许重复值和多个值 ,方法是使用以下命令:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    例如,如果您尝试为 Expires 标头设置属性,请检查消息处理器上属性 HTTPHeader.Expires 令牌的当前值:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    上述命令的输出结果如下之一:

    1. 如果该属性设置为空白,则表示值 i被覆盖为 NOT,以禁止重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送 Expires 标头。
    2. 如果特定属性没有命中,则表示该值不会 被覆盖,并且这是一个具有预先存在的配置的 NOT 标头。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分多次发送给 Apigee Edge(允许重复)。
    3. 如果该属性设置为值 allowDuplicates, multiValued,则表示该值被显式覆盖,并且这是一个现有的配置。 不过,这意味着特定标头可以作为 HTTP 请求或 HTTP 响应的一部分多次发送到 Apigee(允许重复)。

    示例输出 1

    搜索命令的输出示例 1

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued

    示例输出显示,属性 HTTPHeader.Expires 已设置为 allowDuplicates, multiValued。这意味着,系统会覆盖属性 ,以允许标头 Expires 具有重复值或多个值。

    示例输出 2

    搜索命令的示例命令和输出 #2

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    示例输出中未显示任何输出,这表示属性 HTTPHeader.myheader 默认设置为 allowDuplicates, multiValued。 这也意味着,对于标头 myheader,属性 不会被覆盖

  2. 如果您发现以下情况之一,请执行本部分中的其余步骤:
    1. 与特定标头对应的属性会被覆盖,以允许重复值和多个值,如上面的示例输出 1(具有预先存在的配置的标头)所示
    2. 没有与特定标头对应的媒体资源的命中数据,如上方的示例输出 #2 中所示(不是具有预先存在的配置的标头)

    否则,请跳过本部分中的其余步骤。

  3. 修改以下文件。如果不存在,您可以创建该文件。
    /opt/apigee/customer/application/message-processor.properties

    例如,如需使用 vi 打开该文件,请输入以下内容:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. 在属性文件中添加一行,格式如下:

    现有配置

    方案 1:具有预先存在配置的标头

    conf_http_HTTPHeader.Expires=

    无预先存在的配置

    情形 2:不是具有预先存在配置的标题

    conf/http.properties+HTTPHeader.myheader=
  5. 保存更改。
  6. 确保属性文件归 apigee 用户所有。如果不是,请执行以下操作:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. 重启消息处理器:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    如需在不影响流量的情况下重启,请参阅 在不影响流量的情况下滚动重启消息处理器

  8. 如果您有多个消息处理器,请在所有消息处理器上重复执行上述步骤。

验证标头是否配置为不允许重复值和多个值

本部分介绍了如何验证特定标头的属性 HTTPHeader.HEADER_NAME 是否已成功更新,以禁止在消息处理器上出现重复项。

我们将使用 Expires(和 myheader)作为示例标头,并检查相应的属性 HTTPHeader.Expires(和 HTTPHeader.myheader)是否已更新。

  1. 在消息处理器机器上,搜索 /opt/apigee/edge-message- processor/conf 目录中的属性 HTTPHeader.HEADER_NAME,并检查该属性是否已设置为新值,如下所示:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    例如,如果您想检查属性 HTTPHeader.Expires 是否已设置为新值,可以运行以下命令:

    现有配置

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    无预先存在的配置

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. 如果已成功为消息处理器上的 HTTPHeader.HEADER_NAME I 设置新的 HTTP 标头值,则上述命令会在 http.properties 文件中显示新值。
  3. 停用 allowDuplicates 后,上述命令的示例结果如下所示:

    现有配置

    方案 1Expires 标头(具有预先存在的配置的标头)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=

    无预先存在的配置

    情形 2:myheader 标头(不是具有预先存在配置的标头)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
  4. 在上面的示例输出中,请注意,属性 HTTPHeader.Expires(和 HTTPHeader.myheader)已设置为新值 {blank} in http.properties。这表示已在消息处理器上成功停用允许特定 HTTP 标头 Expires(和 myheader)重复和使用多个值的行为。
  5. 如果您仍然看到属性 HTTPHeader.Expires (or HTTPHeader.myheader) 的旧值,请验证您是否已正确按照为标头配置 allowDuplicates 和多个值中所述的所有步骤操作。如果您遗漏了任何步骤,请再次正确重复所有步骤。

    确保您的代理按预期运行,尤其是在代理中存在用于获取和设置标头的功能逻辑时。

  6. 如果您仍然无法修改该属性,请与 Apigee Edge 支持团队联系。