您正在查看 Apigee Edge 文档。
前往
Apigee X 文档。 info
问题
客户端应用收到 HTTP 状态代码 502 Bad Gateway,并收到错误
代码 protocol.http.Response405WithoutAllowHeader,以此响应 API 调用。
出错提示
客户端应用会收到以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能会看到以下错误消息:
{
"fault":{
"faultstring":"Received 405 Response without Allow Header",
"detail":{
"errorcode":"protocol.http.Response405WithoutAllowHeader"
}
}
}可能的原因
如果后端服务器返回 405 Method Not Allowed 状态
代码,而不使用 Allow 标头,则会出现此错误。
根据规范
RFC 7231 第 6.5.5 节:405 不允许的方法,源服务器
必须在 405 响应中生成并发送 Allow 标头字段,其中包含目标资源当前支持的方法
列表。否则,Apigee 会返回
502 Bad Gateway 和错误代码 protocol.http.Response405WithoutAllowHeader.
| 原因 | 说明 | 适用的问题排查说明 |
|---|---|---|
| 后端服务器返回 405 响应,但不使用 Allow 标头 | 处理 API 请求的后端服务器返回 405 状态代码,但不使用 Allow 标头。 |
Edge Public 和 Private Cloud 用户 |
常见诊断步骤
请使用以下工具/方法之一来诊断此错误:
API 监控
如需使用 API 监控诊断错误,请执行以下操作:
- 以具有 适当角色的用户身份登录 Edge 界面。
切换到您要调查问题的组织。
- 依次前往分析 > API 监控 > 调查 页面。
- 选择您观察到错误的具体时间范围。
绘制故障代码 与时间 的关系图。
选择包含故障代码
protocol.http.Response405WithoutAllowHeader的单元格,如下所示:
系统会显示有关故障代码
protocol.http.Response405WithoutAllowHeader的信息,如下所示:
点击查看日志 ,然后展开其中一个失败的请求以查看更多信息。
- 在日志 窗口中,记下以下详细信息:
- 状态代码 :
502 - 故障来源 :
target - 故障代码 :
protocol.http.Response405WithoutAllowHeader。
- 状态代码 :
- 如果故障来源 为
target且故障代码 为protocol.http.Response405WithoutAllowHeader,则表示后端 服务器返回405 Method Not Allowed状态代码,但不使用Allow标头。
跟踪工具
如需使用跟踪工具诊断错误,请执行以下操作:
- 启用
跟踪会话,然后执行以下操作之一:
- 等待
502 Bad Gateway错误发生,或 - 如果您可以重现该问题,请进行 API 调用以重现该问题 -
502 Bad Gateway错误
- 等待
确保显示所有 FlowInfo 处于启用状态:
- 选择其中一个失败的请求,然后检查跟踪记录。
- 浏览跟踪记录的不同阶段,找到发生故障的位置。
您通常会在已发送到目标服务器的请求 阶段之后的流中找到错误,如下所示:
记下跟踪记录中的错误值。
上面的示例跟踪记录显示错误为
Received 405 Response without Allow Header。由于该错误是在请求发送到后端 服务器后由 Apigee 引发的,因此表示后端服务器返回405响应状态代码 但不使用Allow标头。- 在跟踪记录中前往 AX (已记录分析数据)阶段,然后点击该阶段。
在阶段详情 面板中向下滚动到错误 / 响应标头 部分,然后确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
- 您会看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值分别为
protocol.http.Response405WithoutAllowHeader和target, 这表示此错误是由后端返回405响应状态代码但不使用Allow标头导致的。响应标头 值 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
NGINX
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户 ,则可以使用 NGINX 访问日志来确定有关 HTTP
502错误的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
其中: ORG、ORG 和 PORT# 替换为实际值。
- 搜索以查看在特定时间段内(如果问题过去发生过)是否存在任何错误代码
protocol.http.Response405WithoutAllowHeader的502错误,或者是否存在任何请求仍然失败并返回502。 如果您确实发现任何
502错误,且 X-Apigee-fault-code 与protocol.http.Response405WithoutAllowHeader的值匹配,请确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 502 错误示例:
NGINX 访问日志中的上述示例条目具有以下 X-Apigee- fault-code 和 X-Apigee-fault-source: 值:
响应标头 值 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
原因:后端服务器返回 405 响应,但不使用 Allow 标头
诊断
- 使用 API 监控、跟踪工具或 NGINX 访问日志确定 故障代码 和 故障来源,
502 Bad Gateway如常见诊断步骤中所述。 - 如果故障代码 为
protocol.http.Response405WithoutAllowHeader且故障来源的值为target,则表示后端服务器返回405状态代码,但不使用Allow标头。因此,Apigee 会返回502 Bad Gateway,并返回错误代码protocol.http.Response405WithoutAllowHeader。
分辨率
请使用以下方法之一来解决此问题:
后端服务器
方法 1:修复后端服务器以返回 405 状态代码,并使用 Allow 标头:
确保后端服务器始终遵循规范 RFC 7231 第 6.5.5 节:405 不允许的方法,并返回
405状态 代码,方法是在Allow标头中添加允许的方法列表, 如下所示:Allow: HTTP_METHODS
- 例如,如果您的后端服务器允许
GET、POST和HEAD方法,则需要确保Allow标头包含 这些方法,如下所示:Allow: GET, POST, HEAD
故障处理
方法 2:使用故障处理从 API 代理返回 405 状态代码,并使用 Allow 标头:
如果后端服务器返回 405 状态代码,但不使用 Allow
标头,您可以使用故障处理从 API 代理返回 405 状态代码和
Allow 标头,如下所示:
创建政策(例如 AssignMessage 政策 或 RaiseFault 政策 ),并将状态代码设置为
405,并使用Allow标头和自定义 消息。使用 Allow 标头返回 405 的 AssignMessage 政策示例:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
在
TargetEndpoint中创建一个FaultRule,该规则会在收到错误代码为protocol.http.Response405WithoutAllowHeader的502错误时调用该政策。显示 FaultRule 的 TargetEndpoint 配置示例:
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>- 将这些更改保存到 API 代理的新修订版本中,然后部署该修订版本。
- 进行 API 调用,并验证您是否收到了
405状态代码和Allow标头。
配置属性
方法 3:在消息处理器中配置属性,以防止 Apigee Edge 返回 502 错误
- 如果您是 私有云 用户,则可以将属性
HTTP.ignore.allow_header.for.405更新为true,以防止 Apigee Edge 引发502错误,即使后端服务器返回405状态代码,但不使用Allow标头,您也可以使用方法指南: 在消息处理器中配置忽略 405 属性的 Allow 标头。 - 如果您是 Public Cloud 用户, 请与Apigee Edge 支持团队 联系
规范
Apigee 期望后端服务器返回 405 Method Not Allowed 响应,并使用 Allow 标头,如以下规范中所述:
| 规范 | |
|---|---|
| RFC 7231 第 6.5.5 节:405 不允许的方法 | |
| RFC 7231 第 7.4.1 节:允许 |
需要注意的要点
推荐的解决方案是修复后端服务器以返回 405 状态代码
并使用 Allow 标头,并遵循规范
RFC 7231 第 6.5.5 节:405 不允许的方法。
如果您仍然需要 Apigee 支持团队的任何帮助,请前往 必须收集诊断信息。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下 诊断信息,然后与 Apigee Edge 支持团队联系。
如果您是 Public Cloud 用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 用于重现
502 Bad Gateway(错误代码为protocol.http.Response405WithoutAllowHeader)的完整curl命令 - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 针对失败的请求观察到的完整错误消息
- 环境名称
- API 代理软件包
- API 请求的跟踪文件
NGINX 访问日志
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
其中: ORG、ORG 和 PORT# 替换为实际值。
- 消息处理器系统日志
/opt/apigee/var/log/edge-message-processor/logs/system.log