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

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

根据 HTTP 规范 RFC 7230 第 3.2.2 节:字段顺序,Apigee Edge 要求来自客户端的 HTTP 请求或来自后端服务器的 HTTP 响应不包含以相同或不同的值多次传递的相同标头,除非特定标头存在异常且允许有重复。

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

  • 如果客户端多次发送包含特定标头或包含多个 HTTP 标头值的 HTTP 标头(这些标头不允许在 Apigee Edge 中使用重复/多个值),您会收到错误代码 protocol.http.DuplicateHeader400 Bad Request
  • 同样,如果后端服务器多次发送包含特定标头的 HTTP 响应,或包含多个 HTTP 标头值的 HTTP 标头(这些标头不允许在 Apigee Edge 中使用重复或多个值),您将获得 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, allowDuplicate,

  1. blank:HTTP 标头不允许使用重复和多个值。
  2. multiValued:将多值标头拆分为多个标头。HTTP 标头允许使用多个值,但不能出现重复的值。 值 multiValued 已启用,这意味着 test-header=a,b 将转换为 test-header=atest-header=b.
  3. allowDuplicate:允许多个(重复)的 HTTP 标头使用同一名称。
  4. multivalued, allowDuplicate:HTTP 标头可以同时使用多个值和重复值。

HTTPHeader.HEADER_NAME

此属性用于根据 HTTPHeader.ANY 指定的内容替换特定标头的行为

同上。

标头不得包含重复值和多个值

如前所述,默认情况下,Apigee Edge 允许大多数 HTTP 标头使用重复和多个值。这是因为 HTTPHeader.ANY 属性配置了值 multivalued, allowDuplicate.

配置被覆盖

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

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

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

    .
  • 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)。

请求 传出 HeaderS(基于 conf/http.properties+HTTPHeader.test-header= 的值)
<空白> allowDuplicate multiValued allowDuplicate、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

准备工作

在使用本文档中的步骤之前,请确保您已了解为 Private Cloud 配置 Edge 的属性,如 如何配置 Edge 中所述。

为标头配置 allowDuplicates 和多个值

允许存在重复和多个值的 HTTP 标头属性中所述,属性 HTTPHeader.ANY = allowDuplicates, multivalued 的值意味着允许所有标头在 Apigee Edge 中具有重复和多个值。不过,对于某些标头,其值会被明确覆盖,从而不允许使用 HTTPHeader.HEADER_NAME 属性为其添加重复的标头或多个值。

本部分介绍了如何根据如何配置 Edge 中所述的语法,使用相应的令牌配置 HTTPHeader.HEADER_NAME 属性,以允许消息处理器上的任何此类 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. 如果该属性设置为空白,则表示该值会被覆盖(这是一个包含现有配置的标头),从而不允许出现重复的标头和多个值。也就是说,您不能在 HTTP 请求或 HTTP 响应中向 Apigee 发送多次 Expires 标头。
    2. 特定媒体资源没有命中,这意味着该值不会被覆盖(而且这不是包含现有配置的标头)。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee Edge,且发送多次(允许重复)。
    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. 如果该属性设为空白,则表示该值会被覆盖为 NOT,以允许显示重复的标头和多个值也就是说,您不能在 HTTP 请求或 HTTP 响应中向 Apigee 发送多次 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 后,上述命令的示例结果如下所示:

    现有配置

    场景 1到期标头(包含现有配置的标头)

    /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 支持团队联系。