500 内部服务器错误 - EmptyPath

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

问题

客户端应用收到 HTTP 状态代码 500 Internal Server Error, 将错误代码 protocol.http.EmptyPath 作为对 API 调用的响应。

错误消息

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

HTTP/1.1 500 Internal Server Error

此外,您可能还会看到以下错误消息:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

可能的原因

如果后端服务器的请求网址(由流变量表示) <ph type="x-smartling-placeholder"></ph> target.url 包含空路径。

根据规范 <ph type="x-smartling-placeholder"></ph> RFC 3986,第 3 部分:语法组件和 <ph type="x-smartling-placeholder"></ph> RFC 3986,第 3.3 节:路径

  1. URI 语法 包含以下组成部分:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. path 组件必需,且必须始终包含正斜杠 (/),即使路径中不含其他字符也是如此。

因此,如果后端服务器的请求网址不包含 path, 组件,也就是说,它甚至没有正斜线 (/),则 Apigee Edge 返回 500 Internal Server Error 和错误代码 protocol.http.EmptyPath

例如:如果 target.url 的值为 https://www.mocktarget.apigee.net,那么当 path 组件为空或缺失。

原因 说明 适用的问题排查说明
后端服务器网址 (target.url) 的路径为空 流变量 target.url 表示的后端服务器网址的路径为空。 Edge 公有云和私有云用户

常见诊断步骤

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

API 监控

过程 1:使用 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. 选择一个错误代码为 protocol.http.EmptyPath 的单元格,如下所示:

  7. 错误代码 protocol.http.EmptyPath 的相关信息显示为 如下所示:

  8. 点击查看日志 ,展开失败请求对应的行。

  9. 日志窗口中,请注意以下详细信息: <ph type="x-smartling-placeholder">
      </ph>
    • 状态代码500
    • 故障来源target
    • 错误代码protocol.http.EmptyPath
  10. 如果故障来源target错误代码protocol.http.EmptyPath,则表示后端服务器网址具有 空路径。

Trace

步骤 2:使用跟踪工具

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

如需使用跟踪工具诊断错误,请执行以下操作:

  1. 启用跟踪会话,并且 <ph type="x-smartling-placeholder">
      </ph>
    • 等待发生 500 Internal Server Error 错误,或者
    • 如果您可以重现问题,请进行 API 调用以重现问题 500 Internal Server Error
  2. 确保已启用 Show all FlowInfos

  3. 选择其中一个失败请求并检查跟踪记录。
  4. 浏览跟踪记录的不同阶段,并找到失败的位置。
  5. 您会在目标请求流程开始后的流程中发现该错误。 阶段,如下所示:

  6. 请记下跟踪记录中的错误值。

    错误:请求路径不能为空

    由于此错误是在目标请求流程开始阶段之后由 Apigee Edge 引发的, 则表示后端服务器网址中的 path 为空。这会 如果流变量 target.url(表示 后端服务器)可能已通过 请求流程。

  7. 目标请求流已开始阶段的错误点。
  8. 确定更新流变量 target.url 的政策。

    显示 JavaScript 政策更新了流变量 target.url 的跟踪记录示例

    在上面显示的示例跟踪记录中,记下流变量变量的值 在名为 SetTargetURL 的 JavaScript 政策中,将 target.url 更新为 如下:

    target.url : https://mocktarget.apigee.net
    
  9. 请注意,target.url 具有以下组件: <ph type="x-smartling-placeholder">
      </ph>
    • 架构https://mocktarget.apigee.net
    • path:空
  10. 因此,您会收到 Request path cannot be empty 错误。
  11. 进入跟踪记录中的 AX(记录的 Google Analytics 数据)阶段,然后点击该阶段。
  12. 向下滚动到 Stage Details - Error Headers 部分,并确定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

  13. 您将看到 X-Apigee-fault-codeX-Apigee-fault-source 的值显示为 protocol.http.EmptyPathtarget ,这表示 导致此错误的原因是后端服务器网址包含空路径。
    响应标头
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

过程 3:使用 NGINX 访问日志

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

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

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

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

    <ph type="x-smartling-placeholder">
  3. 搜索是否存在任何带有错误代码的 500 错误 protocol.http.EmptyPath(如果问题发生的时间: 过去),或者是否仍有任何请求仍失败并显示 500
  4. 如果您确实在 X-Apigee-fault-code 匹配项中找到了任何 500 错误, protocol.http.EmptyPath 的值,然后确定 X-Apigee-fault-source.

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

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

    标头
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    请注意,X-Apigee-fault-codeX-Apigee-fault-source 的值为 protocol.http.EmptyPathtarget ,这表示 导致此错误的原因是后端服务器网址包含空路径

原因:后端服务器网址 (target.url) 的路径为空

诊断

  1. 使用 API 监控、跟踪工具或 NGINX 访问日志确定 500 Internal Server Error错误代码错误来源,具体说明请参阅 常见的诊断步骤
  2. 如果故障代码protocol.http.EmptyPath,且故障来源target,则表示后端服务器网址包含空 路径
  3. 后端服务器网址由 Apigee 中的流变量 target.url 表示 Edge。如果您尝试更新后端服务器网址(即 target.url 动态使用任何政策( 代理/共享流),以使其具有一个空路径

    <ph type="x-smartling-placeholder">
  4. 确定流变量 target.url 是否确实为空路径,以及 source,获取其值:

    Trace

    使用跟踪工具

    如果您已捕获此错误的跟踪记录,请按照 使用跟踪工具 ,并且:

    1. 验证 target.url 是否为空路径。
    2. 如果是,就看看哪项政策修改或更新了 target.url 以包含空路径。

      显示 JavaScript 政策更新了流程变量的示例跟踪记录 target.url:

    3. 在上面的跟踪示例中,请注意 JavaScript 政策已修改或 已将 target.url 的值更新为包含空路径。
    4. 请注意,target.url 具有以下组件:
      • 架构https://mocktarget.apigee.net
      • path:空

    日志

    在日志服务器中使用日志

    1. 如果您没有此错误的跟踪记录(间歇性问题),请检查 查看是否已记录有关用户流变量值的信息 target.url,使用诸如 <ph type="x-smartling-placeholder"></ph> MessageLogging ServiceCallout 并应用于您的日志服务器。
    2. 如果您有日志,请查看并执行以下操作: <ph type="x-smartling-placeholder">
        </ph>
      1. 验证 target.url 是否为空路径,以及
      2. 看看您能否确定修改了哪些政策 target.url 包含空路径

    API 代理

    查看失败的 API 代理

    如果您没有此错误的跟踪记录或日志,请查看失败的 API 用于确定修改或更新流变量 target.url 的操作 包含无效路径。请检查以下各项:

    • API 代理中的政策
    • 从代理调用的任何共享流
  5. 检查特定策略(例如,AssignMessage 或 JavaScript)修改或 仔细更新流变量 target.url 并确定更新原因 target.url,因此路径为空。

    以下是一些示例政策,用于更新流变量 target.url 错误地包含导致此错误的空路径。

    示例 1

    示例 1:更新 target.url 变量的 JavaScript 政策

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);
    

    请注意,在上面的示例中,流变量 target.url 已更新。 值“https://mocktarget.apigee.net”包含在另一个变量中 url

    请注意,target.url 具有以下组件:

    • 架构https://mocktarget.apigee.net
    • path:空

    由于路径为空,因此 Apigee Edge 会返回 500 Internal Server Error 以及 错误代码 protocol.http.EmptyPath

    示例 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 由 连接变量中包含的值 https://mocktarget.apigee.net url 以及 另一个变量 path 的值,其 值是从 request.header.Path. 检索到的

    如果您有权访问实际请求或跟踪记录,则可以验证实际值 传递给 request.header.Path

    用户提出的请求示例

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    在此示例中,标头路径不会作为请求的一部分发送。因此, 为 null

    因此:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    请注意,target.url 具有以下组件:

    • 架构https://mocktarget.apigee.netnull
    • path:空

    示例 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</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    请注意,target.url 具有以下组件:

    • 架构https://mocktarget.apigee.net
    • path:空

    在上述所有示例中,后端服务器网址中的路径,即 target.url 为空,因此 Apigee Edge 返回 500 Internal Server Error,错误代码为 protocol.http.EmptyPath

解决方法

根据规范 <ph type="x-smartling-placeholder"></ph> RFC 3986 第 2 部分:语法组件中所述,path 组件为 必需,并且必须始终带有正斜杠 (/),即使 path 中的其他字符。请执行以下步骤, 解决此问题:

  1. 确保后端服务器网址(由流变量表示) target.url 始终具有非空路径
    1. 在某些情况下,路径中可能没有资源名称,那么请确保路径 且至少包含一个正斜杠 (/)。
    2. 如果您使用任何其他变量来确定数据流变量的值 target.url,然后确保其他变量没有空路径。
    3. 如果执行任何字符串操作来确定流变量的值 target.url,然后确保字符串的结果或结果 操作的路径不为空。
  2. 诊断部分讨论的示例中,您可以按以下步骤解决此问题: 如下所述:

    示例 1

    示例 1:更新 target.url 变量的 JavaScript 政策

    向变量 url 添加正斜杠 (/) 即可解决此问题 如下所示:

    var url = "https://mocktarget.apigee.net/"
    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);
    

    请确保传递有效的路径,例如 /iloveapis 请求标头 Path 来解决此问题,如下所示:

    示例请求

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    示例 3

    示例 3:AssignMessage 策略通过target.url变量更新 另一个变量

    在 AssignMessage 政策的 <Value> 元素中添加有效路径。对于 例如,您可以使用 /json 作为 MockTarget API。 也就是说,将 <Value> 元素修改为 https://mocktarget.apigee.net/json,如下所示:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

规范

根据 Apigee Edge 的要求,后端服务器网址 没有空路径 以下规范:

规范
<ph type="x-smartling-placeholder"></ph> RFC 3986,第 3 部分:语法组件
<ph type="x-smartling-placeholder"></ph> RFC 3986,第 3.3 节:路径

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

必须收集诊断信息

按照上述说明操作后,如果问题依然存在,请收集以下内容 然后联系 Apigee Edge 支持团队

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

  • 组织名称
  • 环境名称
  • API 代理名称
  • 完成用于重现 500 Internal Server Errorcurl 命令(错误代码为 protocol.http.EmptyPath
  • API 请求的跟踪文件

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

  • 观察到失败请求的完整错误消息
  • 环境名称
  • API 代理软件包
  • 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

参考

用户流变量 - 目标