您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
问题
客户端应用收到 HTTP 状态代码 500 Internal Server Error
及错误代码 protocol.http.BadPath
,作为 API 调用的响应。
错误消息
客户端应用会获得以下响应代码:
HTTP/1.1 500 Internal Server Error
此外,您可能还会看到以下错误消息:
{ "fault":{ "faultstring":"Invalid request path", "detail":{ "errorcode":"protocol.http.BadPath" } } }
可能的原因
如果后端服务器的请求网址(由流变量 target.url
表示)包含以问号 (?
) 开头的 path
,而不是以正斜杠 (/
) 开头的 path
,该正斜杠 (/
) 无效。
根据 RFC 3986 第 3 节:语法组件和 RFC 3986 第 3.3 节:路径规范:
URI 语法 包含以下组成部分:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
path
组件是必需组件,必须以正斜杠 (/
) 开头且始终带有正斜杠。
因此,如果后端服务器的请求网址具有以问号 (?
) 而不是正斜杠 (/
) 开头的 path
组成部分,则 Apigee Edge 会返回 500 Internal Server Error
和错误代码 protocol.http.BadPath
。
例如:如果 target.url
的值为 https://www.mocktarget.apigee.net?json
,则发生此错误,因为发现 path
无效,因为它以问号 (?
) 而不是正斜杠 (/
) 开头。
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
后端服务器网址 (target.url) 的路径无效 | 后端服务器网址中由流变量 target.url 表示的路径部分以问号 (? ) 而不是正斜杠 (/ ) 开头。 |
Edge 公有云和私有云用户 |
常见诊断步骤
使用以下工具/技巧之一来诊断此错误:
API 监控
过程 1:使用 API 监控
要使用 API Monitoring 诊断错误,请执行以下操作:
- 以拥有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往 Analyze > API Monitoring > Investigate 页面。
- 选择您发现错误的具体时间范围。
根据时间绘制故障代码。
选择具有错误代码
protocol.http.BadPath
的单元格,如下所示:错误代码
protocol.http.BadPath
的相关信息如下所示:点击查看日志 ,然后展开失败请求所在的行。
- 在日志窗口中,请注意以下详细信息:
- 状态代码:
500
- 错误来源:
target
- 错误代码:
protocol.http.BadPath
- 状态代码:
- 如果故障来源为
target
且故障代码为protocol.http.BadPath
,则表示后端服务器网址的路径无效。
跟踪记录
过程 2:使用跟踪工具
如需使用跟踪工具诊断错误,请执行以下操作:
- 启用跟踪会话,然后:
- 等待
500 Internal Server Error
错误发生,或者 - 如果您可以重现问题,请进行 API 调用以重现问题
500 Internal Server Error
- 等待
确保已启用 Show all FlowInfos:
- 选择其中一个失败的请求并检查跟踪记录。
- 浏览跟踪记录的不同阶段,并找到失败的位置。
在目标请求流程已开始 阶段之后,您通常会在流程中发现该错误,如下所示:
记下跟踪记录中的错误值:
错误:请求路径无效
由于 Apigee Edge 在目标请求流开始阶段后引发了该错误,因此它表示后端服务器网址具有无效路径。如果 Apigee Edge 中的流变量
target.url
(表示后端服务器的网址)可能已通过目标请求流中的某个政策更新为无效路径,则最有可能发生这种情况。- 从错误流到目标请求流已开始阶段,反向检查每个流中的读取和分配的变量部分。
- 确定流变量
target.url
已更新的政策:显示 JavaScript 政策已更新流变量
target.url:
的示例跟踪记录请注意,在上面显示的示例跟踪记录中,流变量变量
target.url
的值在名为JS- SetTargetURL
的 JavaScript 政策中更新,如下所示:target.url : https://mocktarget.apigee.net?json
- 请注意,
target.url
中的值具有以下组成部分:- 架构:
https
- 授权:
mocktarget.apigee.net
- 路径:
?json
- 架构:
- 由于 path 组成部分以问号 (
?
) 而不是正斜杠 (/
) 开头,因此您会收到错误Invalid request path
。 - 进入跟踪记录中的 AX(已记录 Google Analytics(分析)数据)阶段,然后点击该阶段。
向下滚动到 Phase Details - Error Headers 部分,并确定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
您会看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值分别显示为
protocol.http.BadPath
和target
,这表明此错误是由后端服务器网址无效导致的。响应标头 值 X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
NGINX
过程 3:使用 NGINX 访问日志
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是 Private Cloud 用户,则可以使用 NGINX 访问日志来确定有关 HTTP
500 Internal Server Error
的关键信息。 检查 NGINX 访问日志:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜索以查看在特定持续时间内是否存在任何错误代码为
protocol.http.BadPath
的500
错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示500
。 如果您确实发现任何
500
错误,且 X-Apigee-fault-code 与 X-Apigee-fault-code 的值匹配,则确定 X-Apigee-fault-code 的值。NGINX 访问日志中的 500 错误示例:
NGINX 访问日志中的上述示例条目具有 X-Apigee-fault-code 和 X-Apigee-fault-source 的以下值:
标头 值 X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
请注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值分别是
protocol.http.BadPath
和target
,这表明此错误是由于后端服务器网址具有无效路径而导致的。
原因:后端服务器网址 (target.url) 的路径无效
诊断
- 按照常见诊断步骤中的说明,使用 API Monitoring、Trace Tool 或 NGINX 访问日志确定
500 Internal Server Error
的 Fault Code 和 Fault Source。 - 如果 Fault Code 为
protocol.http.BadPath
,并且 Fault Source 的值为target
,这表示后端服务器网址具有无效路径。 后端服务器网址由 Apigee Edge 中的流变量
target.url
表示。如果您尝试使用目标请求流中的任何政策(在代理/共享流内)动态更新后端服务器网址 (target.url
),从而导致其路径无效,通常就会发生此错误。使用以下方法之一确定流变量
target.url
的确包含无效路径及其值的来源:跟踪记录
使用跟踪工具
如果您已捕获此错误的跟踪记录,请按照使用跟踪工具 中所述的步骤进行操作,
- 验证
target.url
的路径是否无效,即是否以问号 (?
) 而不是正斜杠 (/
) 开头。 如果是,请查看修改或更新
target.url
的值以包含无效路径的政策。显示 JavaScript 政策已更新流变量
target.url
的示例跟踪记录- 在上面的跟踪示例中,请注意 JavaScript 政策已修改或更新
target.url
的值,以包含无效路径。 - 请注意,
target.url
包含以下组件:- 架构:
https
- 授权:
mocktarget.apigee.net
- 路径:
?json
该路径以问号 (
?
)(而非正斜杠 (/
))开头,因此无效。 - 架构:
日志
在日志服务器中使用日志
- 如果您没有此错误的跟踪记录(间歇性问题),请检查您是否已使用
MessageLogging 或
ServiceCallout 政策等政策将流变量
target.url
的值的相关信息记录到日志服务器。 - 如果您有日志,请查看并
- 验证
target.url
的路径是否无效,并 - 看看您能否确定关于哪项政策修改了
target.url
以包含无效路径的信息
- 验证
API 代理
检查出现故障的 API 代理
如果您没有此错误的跟踪记录或日志,请查看出现故障的 API 代理,以确定修改或更新流变量
target.url
以包含无效路径的内容。请检查以下各项:- API 代理中的政策
- 从代理调用的任何共享流
- 验证
请仔细查看会修改或更新流变量
target.url
的具体政策(例如:assignMessage 或 JavaScript),找出将target.url
更新为包含无效路径的原因。以下是一些示例政策,它们会错误地更新流变量
target.url
,使其包含导致此错误的无效路径。示例 1
示例 1:更新
target.url
变量的 JavaScript 政策var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
请注意,在上面的示例中,流变量
target.url
已使用另一个变量url.
中包含的值https://mocktarget.apigee.net?json
进行更新请注意,
url
的值具有以下组成部分:- 架构:
https
- 授权:
mocktarget.apigee.net
- 路径:
?json
路径以问号 (
?
) 开头,而非正斜杠 (/
), (无效)。因此,Apigee Edge 会返回500 Internal Server Error
,错误代码为protocol.http.BadPath
。示例 2
示例 2:根据请求标头中的值更新
target.url
变量的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
请注意,在上述示例中,流变量
target.url
的更新方式是将变量url
包含的值https://mocktarget.apigee.net
与 另一个变量path
(其值从request.header.Path.
检索)的值串联起来如果您有权访问实际请求或跟踪记录,则可以验证传递给
request.header.Path
的实际值。用户提出的请求示例
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
在此示例中,标头路径不会作为请求的一部分发送。因此,在 JavaScript 政策中,变量
path
的值为null
。因此:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
请注意,
target.url
的值具有以下组成部分:- 架构:
https
- 授权:
mocktarget.apigee.net
- 路径:
?user
路径以问号 (
?
) 开头,而非正斜杠 (/
), (无效)。因此,Apigee Edge 会返回500 Internal Server Error
,错误代码为protocol.http.BadPath
。示例 3
示例 3:更新
target.url
变量的 AssignmentMessage 政策<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
请注意,
url
的值具有以下组成部分:- 架构:
https
- 授权:
mocktarget.apigee.net
- 路径:
?echo
同样在本例中,路径以问号 (
?
) 开头,而不是以正斜杠 (/
) 开头,因为后者无效。因此,Apigee Edge 会返回500 Internal Server Error
,错误代码为protocol.http.BadPath
。- 架构:
分辨率
根据网址规范
RFC 3986 第 3 节:语法组件,path
组件是必需的,并且必须始终以 "/" 开头。因此,请按照以下步骤解决此问题:
- 确保由流变量
target.url
表示的后端服务器网址始终具有有效路径,且始终以正斜杠 (/
) 开头。- 在某些情况下,路径中可能没有资源名称,然后确保路径中至少包含一个正斜杠 (
/
)。 - 如果您使用任何其他变量来确定数据流变量
target.url
的值,请确保其他变量没有无效路径。 - 如果您执行任何字符串操作来确定流变量
target.url
的值,请确保字符串操作的结果或结果不包含无效路径。
- 在某些情况下,路径中可能没有资源名称,然后确保路径中至少包含一个正斜杠 (
在上述示例中,您可以按下文所述解决此问题:
示例 1
示例 1:更新
target.url
变量的 JavaScript 政策请在变量
url
中使用正斜杠 (/
) 而非问号 (?
) 来解决此问题,如下所示:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
示例 2
示例 2:根据请求标头中的值更新
target.url
变量的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
请确保将有效路径(例如
/user
)作为请求标头Path
的一部分传递,以解决此问题,如下所示:示例请求:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
示例 3
示例 3:更新
target.url
变量的 AssignmentMessage 政策在 assignMessage 政策的
<Value>
元素中添加有效路径。 也就是说,将<Value>
元素中的问号 (?
) 替换为 正斜杠 (/
) ,并将其设为https://mocktarget.apigee.net/echo
以解决此问题,如下所示:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
规范
Apigee Edge 要求,根据以下规范,后端服务器网址中的
path
组件 必须始终以 正斜杠 (/
) 开头:规范 RFC 3986,第 3 部分:语法组件 RFC 3986,第 3.3 节:路径 如果您仍然需要 Apigee 支持的任何帮助,请参阅必须收集诊断信息。
必须收集的诊断信息
如果按照上述说明操作后,问题仍然存在,请收集以下诊断信息,然后联系 Apigee Edge 支持团队:
如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成用于重现
500 Internal Server Error
且包含错误代码protocol.http.BadPath
的curl
命令 - API 请求的跟踪文件
如果您是 Private Cloud 用户,请提供以下信息:
- 观察到失败请求的完整错误消息
- 环境名称
- API 代理软件包
- 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
参考