400 请求错误 - DuplicateHeader

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

问题

客户端应用收到 HTTP 状态代码 400 Bad Request 和错误代码 protocol.http.DuplicateHeader 作为 API 调用的响应。

错误消息

客户端应用将获得以下响应代码:

HTTP/1.1 400 Bad Request

此外,您可能还会看到类似于如下所示的错误消息:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

可能的原因

如果 Apigee 中不允许有重复的特定 HTTP 标头,就会出现此错误 Edge 在通过 迁移到 Apigee Edge。

根据 RFC 7230,第 3.2.2 节:字段顺序发件人不得生成多个标头 具有相同字段名称的那些字段,除非相应字段的整个字段值 标头字段定义为以逗号分隔的列表,[即#(values)] 或标题字段是 众所周知的异常。如果 Apigee Edge 找到特定标头, 在客户端发送的 HTTP 请求中不止一次 返回 400 Bad Request 和错误代码 protocol.http.DuplicateHeader

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

以下是导致此错误的可能原因:

原因 说明 适用的问题排查说明
请求中的标头重复 从客户端应用到 Apigee 的 HTTP 请求包含重复的标头。 Edge 公有云和私有云用户

常见诊断步骤

使用以下工具/技术之一来诊断此错误:

API 监控

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

如需使用 API Monitoring 诊断错误,请执行以下操作:

  1. <ph type="x-smartling-placeholder"></ph> 以拥有 相应角色
  2. 切换到您要在其中调查问题的单位。

  3. 导航至分析 >API 监控 >调查页面。
  4. 选择您观察到错误的具体时间范围。
  5. 确保“代理”过滤条件设置为全部。 <ph type="x-smartling-placeholder">
  6. 根据时间绘制错误代码
  7. 选择错误代码为 protocol.http.DuplicateHeader 的单元格 如下所示:

  8. 有关错误代码 protocol.http.DuplicateHeader 的信息是 如下所示:

    <ph type="x-smartling-placeholder">
  9. 点击查看日志,然后展开失败请求对应的行。
  10. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    1. 状态代码400
    2. 故障来源apigee
    3. 错误代码protocol.http.DuplicateHeader
  11. 如果故障来源的值为 apigeeMP ,且故障代码的值为 protocol.http.DuplicateHeader,则表示来自 客户端包含重复的标头。

跟踪工具

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

NGINX

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

如需使用 NGINX 访问日志诊断错误,请执行以下操作:

  1. 如果您是私有云用户,则可以使用 NGINX 访问日志来确定 有关 HTTP 400 错误的关键信息。
  2. 查看 NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中ORGENVPORT# 替换为 实际值。

  3. 搜索以查看在特定时间段内是否存在任何 400 错误(如果 过去出现的问题),或者是否有任何请求仍以失败告终, 400
  4. 如果您确实在 X-Apigee-fault-code 中找到了任何 400 错误 与 protocol.http.DuplicateHeader 的值匹配,则 确定 X-Apigee-fault-source.

    NGINX 访问日志中的 400 错误示例

    以上 NGINX 访问日志中的示例条目包含 X-Apigee- fault-code X-Apigee-fault-source:

    响应标头
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

原因:请求中的标头重复

诊断

  1. 确定使用 API 观察到的错误的错误代码错误来源 监控或 NGINX 访问日志(如常见诊断步骤中所述)。
  2. 如果故障来源的值为 apigeeMP,则 表示客户端应用向 Apigee 发送的请求包含重复项 标头。
  3. 您可以使用 以下方法之一:

    错误消息

    使用错误消息

    1. 如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅 faultstringfaultstring 包含 已多次发送的标头名称。

      示例错误消息:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 在上述错误消息中,您可以看到标头 Expires 为 如 faultstring 中所示。

    实际请求

    使用实际请求

    1. 如果您可以访问客户端应用发出的实际请求,则 请执行以下步骤:

      1. 验证请求中传递的标头列表。
      2. 如果您发现某个标题在 具有相同值或不同值的请求, 错误。

      示例请求

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      在上面的示例请求中,发送标头 Expires 的次数超过 一次。因此,此请求将失败,并显示 400 Bad Request 错误, 错误代码:protocol.http.DuplicateHeader

      <ph type="x-smartling-placeholder">
    2. 或者,如果您有权访问客户端日志,则可以查看 向 Apigee Edge 发出实际请求的相关信息,并确定 多次发送相同的内容

分辨率

解决重复问题

选项 1 [推荐选项] 修复客户端应用,使其不包含重复标头

<ph type="x-smartling-placeholder">
  1. 分析特定客户端发送重复标头的原因。例如: Expires。验证 API 代理是否可以接受 重复标题。通常,按照 HTTP 规范,这种做法不可取 RFC7230
  2. 如果您不希望发送重复的标头,请修改您的客户端应用。

    在上面的示例中,您会发现标头 Expires 发送了 两次,这并不可取。要解决此问题,请将 Expires 标头运行一次,如下所示:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. 如果需要,并且您希望允许出现重复的标头,请转到 选项 2 使用 CwC 属性

CwC

选项 2 使用 CwC 属性

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

Apigee 提供了一种 CwC 属性 HTTPHeader.<HeaderName> 来允许客户端 和目标服务器向 Apigee Edge 中的 API 代理发送重复的标头。

CwC 属性
HTTPHeader.<HeaderName> allowDuplicates,multivalued

例如,可以在消息处理器上设置以下属性以允许重复和 标头 Expires 有多个值。

HTTPHeader.Expires=allowDuplicates, multiValued
  1. 如果您是 Private Cloud 用户,可将该属性配置为 Apigee Edge 不会引发 400 Bad Request 错误,即使请求 包含使用 的重复标头 方法指南:配置消息处理器以使用重复标头
  2. 如果您是公有云用户,请与 Apigee Edge 支持团队联系以配置此属性 。

规范

Apigee 要求客户端应用不会在请求中发送重复的标头 符合以下 RFC 规范:

规范
<ph type="x-smartling-placeholder"></ph> RFC 7230,第 3.2.2 节:字段顺序
<ph type="x-smartling-placeholder"></ph> RFC 7230,第 3.2 节“标头字段”

如果您仍需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息

必须收集的诊断信息

请收集以下诊断信息,然后联系 Apigee Edge 支持团队

如果您是公有云用户,请提供以下信息:

  • 组织名称
  • 环境名称
  • API 代理名称
  • 完成用于重现 400 错误的 curl 命令
  • API 请求的跟踪文件

如果您是 Private Cloud 用户,请提供以下信息:

  • 观察到失败请求的完整错误消息
  • 环境名称
  • API 代理软件包
  • 完成您用于重现 400 错误的 curl 命令
  • API 请求的跟踪文件
  • NGINX 访问日志:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中ORGENVPORT# 替换为 实际值。

  • 消息处理器系统日志 /opt/apigee/var/log/edge-message-processor/logs/system.log