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

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

<ph type="x-smartling-placeholder">

根据 HTTP 规范 <ph type="x-smartling-placeholder"></ph> RFC 7230 第 3.2.2 节:字段顺序),Apigee Edge 希望 来自后端服务器的客户端或 HTTP 响应未包含传递的相同标头 多次使用相同或不同的值,除非特定标头存在例外情况 可以有重复的关键字。

默认情况下,Apigee Edge 允许将重复项和多个值传递到大多数 HTTP 标头。但是,它不支持 标题不允许重复和多个值。 因此:

  • 您会收到包含错误代码的 400 Bad Request 如果客户端发送包含特定数据的 HTTP 请求,则为 protocol.http.DuplicateHeader 标头,或与不允许 在 Apigee Edge 中有重复/多个值。
  • 同样,您会收到包含错误代码的 502 Bad Gateway 如果后端服务器发送包含以下内容的 HTTP 响应,则为 protocol.http.DuplicateHeader 或使用多个 HTTP 标头的值 可以在 Apigee Edge 中拥有重复或多个值

要解决这些错误,推荐的解决方案是修复客户端应用 和后端服务器,请勿发送重复的标头并遵守相关规范 RFC 7230 第 3.2.2 节:字段顺序,如以下问题排查手册中所述:

但在某些情况下,您可能需要添加例外情况,以包含重复项和多个 某些 HTTP 标头的值。在此类情况下,您可以允许使用重复的标头 特定 HTTP 标头的值,只需在HTTPHeader.HEADER_NAME 消息处理器级别。

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

允许使用重复项和多个值的 HTTP 标头属性

Apigee Edge 提供了以下两个属性来控制允许 API 访问 出现重复和多个 HTTP 标头值。请注意,您只能在 使用令牌语法的消息处理器(详见 如何配置 Edge

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

此属性指示所有 HTTP 网页是否允许使用重复值或多个值 标头,包括作为客户端或 HTTP 发出的 HTTP 请求的一部分发送的自定义标头 发送响应。

默认值

multivalued, allowDuplicate,

<ph type="x-smartling-placeholder">
  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

<ph type="x-smartling-placeholder">
同上。

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

如前所述,Apigee Edge 允许大部分 HTTP 请求使用重复项和多个值, 标头。这是因为,HTTPHeader.ANY属性 配置了值 multivalued, allowDuplicate.

配置已覆盖

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

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

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

    .
  • HTTPHeader.HEADER_NAME=

    此配置会更改默认行为也就是说, 标题不得含有重复项和多个值

。 <ph type="x-smartling-placeholder">

确定不允许存在重复项和多个值的标头

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

  • 不允许出现重复和多个值 的具体标题 您的 Apigee Edge 私有云设置
  • 具有原有配置的特定标头
  1. 在消息处理器机器上,搜索属性 HTTPHeader. /opt/apigee/edge-message-processor/conf 目录,如下所示:

    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. 覆盖配置部分所述, 请注意上述示例输出中的以下信息: <ph type="x-smartling-placeholder">
      </ph>
    1. HTTP 标头 Connection 会被覆盖,但可以 重复和多个值
    2. HTTP 标头 HostExpires 会被覆盖, 不允许有 重复和多个值
    3. HTTP 标头 Date 已被覆盖,因此可以重复 但不 可以有多个值
    4. 此处显示的所有标头(ConnectionHostExpiresDate 在上述示例中)称为标头,此标头中包含既有配置 文档。
    。 <ph type="x-smartling-placeholder">

Apigee Edge 的行为

下表介绍了 Apigee Edge 在以如下形式发送标头时的行为 重复且具有多个值,具体取决于 HTTPHeader 属性的使用方式 使用示例 HTTPHeader test-header

请求 基于 conf/http.properties+HTTPHeader.test-header= 的值的传出 HEADERS
<空白> 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
<ph type="x-smartling-placeholder">

准备工作

在执行本文档中的步骤之前,请确保您已了解如何配置 私有云上的 Edge,如中所述 如何配置 Edge

为标头配置 allowDuplicates 和多个值

<ph type="x-smartling-placeholder">

允许重复和 多个值,则属性 HTTPHeader.ANY = allowDuplicates, multivalued 的值意味着允许所有标头包含重复项和多个值 Apigee Edge。不过,某些标头的值会被明确覆盖,以避免 使用该属性时,允许使用重复的标头或多个值 HTTPHeader.HEADER_NAME

本部分介绍了如何配置媒体资源 HTTPHeader.HEADER_NAME - 允许任何对象包含重复项和多个值 消息处理器上的此类 HTTP 标头,根据语法使用相应的令牌 如何配置 Edge 中所述。

<ph type="x-smartling-placeholder">

在本部分中,我们将以 Expires(和 myheader)为例 标头中,我们允许其出现重复项和多个值,具体如下所述:

  1. <ph type="x-smartling-placeholder"></ph> 确定 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. 属性设为空白,则意味着该值会被覆盖( 是包含现有配置的标头),以防止出现重复的标头和多个 值。也就是说,发送 Expires 标头的次数不能超过 一次作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee。
    2. 特定媒体资源没有匹配数据,就意味着该值 覆盖(这并非具有原有配置的标头)。这意味着 特定标头可以多次发送(允许重复发送), 向 Apigee Edge 发送 HTTP 请求或 HTTP 响应。
    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
    

    若要在不影响流量的情况下重启,请参阅 <ph type="x-smartling-placeholder"></ph> 在不影响流量的情况下滚动重启消息处理器

  8. 如果有多个消息处理器,请对所有 消息处理器。

验证标头是否已配置为包含重复项和多个值

<ph type="x-smartling-placeholder">

本部分介绍了如何验证 已更新特定标头的 HTTPHeader.HEADER_NAME 成功允许在消息处理器上执行重复项。

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

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

  1. 在消息处理器计算机上,搜索属性 HTTPHeader.HEADER_NAME/opt/apigee/edge-message-processor/conf 目录,并检查其是否 新值,如下所示:
    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 已被 用新值 allowDuplicates, multiValued 设置 http.properties。这表示允许重复和 已成功在消息处理器上配置 HTTPHeader 中的值。
  5. 如果您仍然看到属性 HTTPHeader.HEADER_NAME 的旧值, 然后确认您已遵循 正确配置标头的 allowDuplicates 和多个值。 如果您遗漏了任何步骤,请再次正确地重复所有步骤。 <ph type="x-smartling-placeholder">

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

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

停用标头的 allowDuplicates

本部分介绍了如何配置 HTTPHeader.{Headername} 属性, 在邮件中,不允许特定 HTTP 标头使用重复和多个值 处理方,根据 API 文档中所述语法使用相应的令牌 如何配置 Edge

<ph type="x-smartling-placeholder">

在本部分中,我们将以 Expires(和 myheader)为例 标头,如下所述:

  1. <ph type="x-smartling-placeholder"></ph> 确定 HTTPHeaderHEADER_NAME 属性的当前值 确保该复选框未被停用,以允许存在重复项和多个值 创建 Deployment
    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 允许使用重复的标题和多个值。不允许发送 在 HTTP 请求或 HTTP 响应中多次使用 Expires 标头 到 Apigee。
    2. 特定媒体资源没有匹配数据,就意味着该值 覆盖,这是一个具有原有配置的 NOT 标头。这意味着 允许将特定标头作为 对 Apigee Edge 的 HTTP 请求或 HTTP 响应。
    3. 该属性的值设置为 allowDuplicates, multivalued,则该值设为 表示值会被明确覆盖,并且这是一项现有配置。 不过,这意味着特定标头可以发送多次(重复 允许)作为 HTTP 请求或 HTTP 响应的一部分。

    示例输出 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. 如果您发现以下任一情况,请执行本部分中的其余步骤: <ph type="x-smartling-placeholder">
      </ph>
    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
    

    若要在不影响流量的情况下重启,请参阅 <ph type="x-smartling-placeholder"></ph> 在不影响流量的情况下滚动重启消息处理器

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

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

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

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

<ph type="x-smartling-placeholder">
  1. 在消息处理器计算机上,搜索属性 HTTPHeader.HEADER_NAME(位于 /opt/apigee/edge-message- processor/conf 目录中),并检查它是否已设置为使用新值: 如下所示:

    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 我部署了消息处理器,然后发布了上述内容 命令会显示 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} http.properties。这表示允许重复 特定 HTTP 标头 Expires 的多个值(以及 myheader) 已成功停用消息处理器。
  5. 如果您仍然看到属性 HTTPHeader.Expires (or HTTPHeader.myheader) 的旧值,请验证您是否已按照 为标头配置 allowDuplicates 和多个值 正确。如果您遗漏了任何步骤,请再次正确地重复所有步骤。

    <ph type="x-smartling-placeholder">

    确保代理按预期运行,尤其是存在有效逻辑的情况下 来获取和设置代理中的标头。

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