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

您正在查看 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 标头发送多个值,您将收到错误代码为 protocol.http.DuplicateHeader502 Bad Gateway

如需解决这些错误,建议的解决方案是修正客户端应用和后端服务器,使其不会发送重复的标头,并遵循规范 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 标头重复和多个值。
  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 属性的配置方式,其中 HTTPHeader 示例为 test-header

请求 根据 conf/http.properties+HTTPHeader.test-header= 的值设置传出 HEADERS
<Blank> allowDuplicates multiValued allowDuplicates,多值(默认)
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. 如果没有针对特定属性的命中,则表示该值未被覆盖(并且这不是一个具有预先配置的标头)。这意味着特定标头可以作为 HTTP 请求或 HTTP 响应的一部分向 Apigee Edge 发送多次(允许重复发送)。
    3. 该属性的值设置为 allowDuplicates, multiValued,这意味着该值会被明确覆盖 (这是一个具有现有配置的标头)。这意味着,您可以多次(允许重复)在向 Apigee 发送的 HTTP 请求或 HTTP 响应中发送特定标头。

    搜索命令的示例输出

    /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. 在上面的示例输出中,请注意 http.properties 中的属性 HTTPHeader.Expires 已设置为新值 allowDuplicates, multiValued。这表示,消息处理器上已成功配置允许在 HTTPHeader 中使用重复值和多个值的行为。
  5. 如果您仍然看到属性 HTTPHeader.HEADER_NAME 的旧值,请验证您是否已正确执行了为标头配置 allowDuplicates 和多个值中列出的所有步骤。 如果您漏掉了某个步骤,请正确重复所有步骤。

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

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

为标头停用 allowDuplicates

本部分介绍了如何配置属性 HTTPHeader.{Headername},以便根据如何配置 Edge 中所述的语法,使用相应的令牌在消息处理器上针对特定 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. 如果将此属性设为空白,则表示该值已被覆盖,以禁止出现重复标头和多个值。也就是说,在向 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)已在 http.properties 中使用新值 {blank} 进行设置。这表示,消息处理器上已成功停用允许为特定 HTTP 标头 Expires(和 myheader)设置重复值和多个值的行为。
  5. 如果您仍然看到属性 HTTPHeader.Expires (or HTTPHeader.myheader) 的旧值,请验证您是否已正确按照为标头配置 allowDuplicates 和多个值中列出的所有步骤操作。如果您遗漏了任何步骤,请再次正确地重复所有步骤。

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

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