<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
。
以下是导致此错误的可能原因:
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
请求中的标头重复 | 从客户端应用到 Apigee 的 HTTP 请求包含重复的标头。 | Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技术之一来诊断此错误:
API 监控
<ph type="x-smartling-placeholder">
如需使用 API Monitoring 诊断错误,请执行以下操作:
- <ph type="x-smartling-placeholder"></ph> 以拥有 相应角色。
切换到您要在其中调查问题的单位。
- 导航至分析 >API 监控 >调查页面。
- 选择您观察到错误的具体时间范围。
- 确保“代理”过滤条件设置为全部。 <ph type="x-smartling-placeholder">
- 根据时间绘制错误代码。
选择错误代码为
protocol.http.DuplicateHeader
的单元格 如下所示:有关错误代码
<ph type="x-smartling-placeholder">protocol.http.DuplicateHeader
的信息是 如下所示:- 点击查看日志,然后展开失败请求对应的行。
- 在日志窗口中,请注意以下详细信息:
<ph type="x-smartling-placeholder">
- </ph>
- 状态代码:
400
- 故障来源:
apigee
- 错误代码:
protocol.http.DuplicateHeader
。
- 状态代码:
- 如果故障来源的值为
apigee
或MP
,且故障代码的值为protocol.http.DuplicateHeader
,则表示来自 客户端包含重复的标头。
跟踪工具
<ph type="x-smartling-placeholder">NGINX
<ph type="x-smartling-placeholder">如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 NGINX 访问日志来确定
有关 HTTP
400
错误的关键信息。 查看 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 搜索以查看在特定时间段内是否存在任何
400
错误(如果 过去出现的问题),或者是否有任何请求仍以失败告终,400
。 如果您确实在 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
原因:请求中的标头重复
诊断
- 确定使用 API 观察到的错误的错误代码和错误来源 监控或 NGINX 访问日志(如常见诊断步骤中所述)。
- 如果故障来源的值为
apigee
或MP
,则 表示客户端应用向 Apigee 发送的请求包含重复项 标头。 您可以使用 以下方法之一:
错误消息
使用错误消息
如果您有权查看从 Apigee Edge 收到的完整错误消息,则: 请参阅
faultstring
。faultstring
包含 已多次发送的标头名称。示例错误消息:
"faultstring":"Duplicate Header \"Expires\""
- 在上述错误消息中,您可以看到标头
Expires
为 如faultstring
中所示。
实际请求
使用实际请求
如果您可以访问客户端应用发出的实际请求,则 请执行以下步骤:
- 验证请求中传递的标头列表。
- 如果您发现某个标题在 具有相同值或不同值的请求, 错误。
示例请求:
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"
在上面的示例请求中,发送标头
<ph type="x-smartling-placeholder">Expires
的次数超过 一次。因此,此请求将失败,并显示400 Bad Request
错误, 错误代码:protocol.http.DuplicateHeader
。- 或者,如果您有权访问客户端日志,则可以查看 向 Apigee Edge 发出实际请求的相关信息,并确定 多次发送相同的内容
分辨率
解决重复问题
选项 1 [推荐选项] 修复客户端应用,使其不包含重复标头
<ph type="x-smartling-placeholder">- 分析特定客户端发送重复标头的原因。例如:
Expires
。验证 API 代理是否可以接受 重复标题。通常,按照 HTTP 规范,这种做法不可取 RFC7230。 - 如果您不希望发送重复的标头,请修改您的客户端应用。
在上面的示例中,您会发现标头
Expires
发送了 两次,这并不可取。要解决此问题,请将Expires
标头运行一次,如下所示:curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
- 如果需要,并且您希望允许出现重复的标头,请转到 选项 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
- 如果您是 Private Cloud 用户,可将该属性配置为
Apigee Edge 不会引发
400 Bad Request
错误,即使请求 包含使用 的重复标头 方法指南:配置消息处理器以使用重复标头。 - 如果您是公有云用户,请与 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
其中:ORG、ENV 和 PORT# 替换为 实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log