您正在查看 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 (这种情况无效),就会出现此错误。
根据规范 RFC 3986 第 3 节:语法组成部分和 RFC 3986,第 3.3 节:路径:
URI 语法 包含以下组成部分:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragmentpath组件是必需的,并且必须以正斜杠 (/) 开头,且始终包含正斜杠。
因此,如果后端服务器的请求网址包含以问号 (?) 而非正斜杠 (/) 开头的 path 组件,则 Apigee Edge 会返回 500 Internal Server Error 和错误代码 protocol.http.BadPath。
例如:如果 target.url 的值为 https://www.mocktarget.apigee.net?json,则会发生此错误,因为系统发现 path 无效,因为它以问号 (?) 开头,而不是以正斜杠 (/) 开头。
| 原因 | 说明 | 适用的问题排查说明 |
|---|---|---|
| 后端服务器网址 (target.url) 的路径无效 | 由流变量 target.url 表示的后端服务器网址中的路径部分以问号 (?) 开头,而不是以正斜线 (/) 开头。 |
Edge Public 和 Private Cloud 用户 |
常见诊断步骤
您可以使用以下工具/方法来诊断此错误:
API 监控
方法 1:使用 API Monitoring
如需使用 API 监控功能诊断错误,请执行以下操作:
- 以具有 适当角色的用户身份 登录 Apigee Edge 界面。
切换到您要调查问题的组织。
- 前往分析 > API 监控 > 调查页面。
- 选择您发现错误的具体时间范围。
绘制故障代码与时间的对比图。
选择具有故障代码
protocol.http.BadPath的单元格,如下所示:
系统会显示有关故障代码
protocol.http.BadPath的信息,如下所示:
点击查看日志 ,然后展开失败请求对应的行。
- 在日志窗口中,记下以下详细信息:
- 状态代码:
500 - 故障来源:
target - 故障代码:
protocol.http.BadPath
- 状态代码:
- 如果 Fault Source 为
target且 Fault Code 为protocol.http.BadPath,则表示后端服务器网址的路径无效。
跟踪记录
程序 2:使用 Trace 工具
如需使用 Trace 工具诊断错误,请执行以下操作:
- 启用跟踪会话,并选择以下任一选项:
- 等待
500 Internal Server Error错误发生,或 - 如果您可以重现问题,请进行 API 调用以重现问题
500 Internal Server Error
- 等待
确保已启用显示所有 FlowInfo:

- 选择一个失败的请求,然后检查轨迹。
- 浏览轨迹的不同阶段,找到发生故障的位置。
您通常会在目标请求流程已启动 阶段之后的流程中发现该错误,如下所示:

记下轨迹中的错误值:
错误:请求路径无效
由于此错误是由 Apigee Edge 在 Target Request Flow Started 阶段之后引发的,因此表示后端服务器网址具有无效路径。如果 Apigee Edge 中的流变量
target.url(表示后端服务器的网址)可能已通过目标请求流中的某项政策更新为无效路径,则很可能会发生这种情况。- 从错误流向 Target Request Flow Started 阶段反向检查每个流中的读取和分配的变量部分。
- 确定更新了流变量
target.url的政策:显示 JavaScript 政策更新了流变量
target.url:的跟踪记录示例
在上面显示的示例跟踪记录中,请注意流变量
target.url的值在名为JS- SetTargetURL的 JavaScript 政策中更新,如下所示:target.url : https://mocktarget.apigee.net?json - 请注意,
target.url中的值包含以下组成部分:- 方案:
https - authority:
mocktarget.apigee.net - 路径:
?json
- 方案:
- 由于路径组成部分以问号 (
?) 开头,而不是以正斜杠 (/) 开头,因此您会收到错误Invalid request path。 - 在轨迹中找到 AX(记录的分析数据)阶段,然后点击它。
向下滚动到阶段详细信息 - 错误标头部分,并确定 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.BadPathX-Apigee-fault-source target
NGINX
程序 3:使用 NGINX 访问日志
如需使用 NGINX 访问日志诊断错误,请执行以下操作:
- 如果您是私有云用户,则可以使用 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 与protocol.http.BadPath的值匹配,请确定 X-Apigee-fault-source 的值。NGINX 访问日志中的 500 错误示例:
上述 NGINX 访问日志中的示例条目具有以下 X-Apigee-fault-code 和 X-Apigee-fault-source 值:
标头 值 X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target请注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值分别为
protocol.http.BadPath和target,这表示此错误是由后端服务器网址的无效路径引起的。
原因:后端服务器网址 (target.url) 的路径无效
诊断
- 使用 API 监控、Trace 工具或 NGINX 访问日志确定
500 Internal Server Error的故障代码和故障来源,如常见诊断步骤中所述。 - 如果故障代码为
protocol.http.BadPath,且故障来源的值为target,则表示后端服务器网址具有无效路径。 后端服务器网址由 Apigee Edge 中的流变量
target.url表示。如果您尝试使用目标请求流中的任何政策(在代理/共享流内)动态更新后端服务器网址 (target.url),使其具有无效路径,则通常会发生此错误。使用以下方法之一,确定流变量
target.url是否确实具有无效 路径及其值来源:跟踪记录
使用 Trace 工具
如果您已针对此错误捕获了轨迹,请按照使用 Trace 工具 中所述的步骤操作,并
- 验证
target.url是否具有无效路径,即是否以问号 (?) 开头,而不是以正斜杠 (/) 开头。 如果存在,请找出将
target.url的值修改或更新为包含无效路径的政策。显示 JavaScript 政策更新了流变量
target.url的跟踪记录示例
- 在上面的示例轨迹中,请注意 JavaScript 政策已修改或更新
target.url的值,使其包含无效路径。 - 请注意,
target.url包含以下组件:- 方案:
https - authority:
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:JavaScript 政策更新
target.url变量var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
在上面的示例中,请注意,流变量
target.url会使用另一个变量url.中包含的值https://mocktarget.apigee.net?json进行更新请注意,
url的值包含以下组成部分:- 方案:
https - authority:
mocktarget.apigee.net - 路径:
?json
路径以问号 (
?) 开头,而不是正斜杠 (/),这种情况无效。因此,Apigee Edge 会返回500 Internal Server Error,并显示错误代码protocol.http.BadPath。示例 2
示例 2:JavaScript 政策根据请求标头中的值更新
target.url变量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 + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
请注意,
target.url的值包含以下组成部分:- 方案:
https - authority:
mocktarget.apigee.net - 路径:
?user
路径以问号 (
?) 开头,而不是正斜杠 (/),这种情况无效。因此,Apigee Edge 会返回500 Internal Server Error,并显示错误代码protocol.http.BadPath。示例 3
示例 3:使用 AssignMessage 政策更新
target.url变量<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 - authority:
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:JavaScript 政策更新
target.url变量在变量
url中使用正斜杠 (/) 而不是问号 (?) 来解决此问题,如下所示:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
示例 2
示例 2:JavaScript 政策根据请求标头中的值更新
target.url变量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:AssignMessage 政策更新
target.url变量在 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 请求的轨迹文件
如果您是私有云用户,请提供以下信息:
- 失败请求的完整错误消息
- 环境名称
- 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
参考