500 內部伺服器錯誤 - 空白路徑

查看 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"
      }
   }
}

可能原因

如果後端伺服器的要求網址以流程變數表示,就會發生這個錯誤 target.url,包含空白路徑。

根據規格 RFC 3986,第 3 節:語法元件 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 表示的後端伺服器網址包含空白路徑。 邊緣公有雲和私有雲使用者

常見的診斷步驟

請使用下列其中一項工具/技巧診斷這個錯誤:

API Monitoring

程序 #1:使用 API 監控功能

如何使用 API Monitoring 診斷錯誤:

  1. 以使用者身分登入 Apigee Edge UI 適當角色
  2. 切換到您要調查問題的機構。

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 根據「時間」繪製「Fault Code」指標。

  6. 選取含有錯誤程式碼 protocol.http.EmptyPath 的儲存格,如下所示:

  7. 錯誤程式碼 protocol.http.EmptyPath 的相關資訊顯示為 如下所示:

  8. 按一下「查看記錄」 即可展開失敗要求的資料列。

  9. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 500
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.EmptyPath
  10. 如果「Fault Source」target,且「Fault Code」protocol.http.EmptyPath,表示後端伺服器網址具有 空白路徑。

Trace

程序 2:使用追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段,並
    • 等待 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 的追蹤記錄範例:

    在上方顯示的追蹤記錄範例中,記下流程變數變數的值 「target.url 」已更新至名為 SetTargetURL 的 JavaScript 政策,如下所示: 如下:

    target.url : https://mocktarget.apigee.net
    
  9. 請注意,target.url 包含下列元件:
    • 配置: https://mocktarget.apigee.net
    • path:空白
  10. 因此,您會收到 Request path cannot be empty 錯誤。
  11. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  12. 向下捲動至「Phase 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 存取記錄

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷 取得 HTTP 500 Internal Server Error 的重要資訊
  2. 查看 NGINX 存取記錄:

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

  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. 如果「Fault Code」protocol.http.EmptyPath,且「Fault Source」出現 值為 target,就表示後端伺服器網址含有 空白 路徑
  3. 在 Apigee 中,後端伺服器網址會以流程變數 target.url 表示 邊緣這類錯誤通常會發生在嘗試更新後端伺服器網址時 target.url 動態使用任一政策 (在 Proxy/共用流程),因此含有「空白路徑」

  4. 判斷資料流變數 target.url 確實包含空白路徑, 請採取下列任一步驟,以此方式擷取該值:

    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,使用以下政策: MessageLogging 傳送至記錄伺服器的服務呼叫
    2. 如有記錄檔,請查看記錄檔並:
      1. 驗證 target.url 是否包含空白路徑,並且
      2. 看看是否可以判斷修改的政策「target.url」 必須包含空白路徑

    API Proxy

    檢查失敗的 API Proxy

    如果沒有這項錯誤的追蹤記錄或記錄檔,請查看失敗的 API 透過 Proxy 判斷哪些內容經過修改或更新流程變數 target.url 包含無效的路徑。請檢查下列事項:

    • API Proxy 中的政策
    • 從 Proxy 叫用的任何共用流程
  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>
    

    在這個例子中,標頭路徑不會做為要求的一部分傳送。因此,值 JavaScript 政策中的變數路徑為 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 Policy 透過更新 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

解決方法

根據規格 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 會根據要求,後端伺服器網址 沒有空白路徑。 下列規格:

規格
RFC 3986,第 3 節:語法元件
RFC 3986,第 3.3 節:路徑

如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊

必須收集診斷資訊

如果按照上述說明操作後仍無法解決問題,請收集下列資訊 ,然後與 Apigee Edge 支援團隊聯絡。

如果您是公有雲使用者,請提供下列資訊:

  • 機構名稱
  • 環境名稱
  • API Proxy 名稱
  • 完成 curl 指令,用於重現 500 Internal Server Error 及錯誤代碼 protocol.http.EmptyPath
  • API 要求的追蹤檔

如果您是 Private Cloud 使用者,請提供下列資訊:

  • 偵測到失敗要求的完整錯誤訊息
  • 環境名稱
  • API Proxy 組合
  • 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

參考資料

流程變數 - 目標