500 內部伺服器錯誤 - BadPath

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。
info

問題

用戶端應用程式會收到 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 節:路徑:

  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.BadPath。

舉例來說,如果 target.url 的值為 https://www.mocktarget.apigee.net?json,則會發生此錯誤,因為系統發現 path無效,因為該值是以問號 (?) 開頭,而非正斜線 (/)。

原因 說明 適用於以下裝置的疑難排解說明
後端伺服器網址 (target.url) 的路徑無效 流程變數 target.url 代表後端伺服器網址中的路徑元件,但開頭是問號 (?),而非正斜線 (/)。 Edge 公有和私有雲使用者

常見的診斷步驟

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

API Monitoring

程序 1:使用 API Monitoring

如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:

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

  3. 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
  4. 選取您觀察到錯誤的特定時間範圍。
  5. 繪製「錯誤代碼」與「時間」的關係圖。

  6. 選取含有故障代碼 protocol.http.BadPath 的儲存格,如下所示:

  7. 故障代碼 protocol.http.BadPath 的相關資訊會顯示如下:

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

  9. 在「記錄」視窗中,記下下列詳細資料:
    • 狀態碼: 500
    • 錯誤來源: target
    • 故障代碼: protocol.http.BadPath
  10. 如果「Fault Source」為 target,且「Fault Code」為 protocol.http.BadPath,表示後端伺服器網址的路徑無效。

追蹤記錄

程序 #2:使用追蹤工具

如要使用「追蹤」工具診斷錯誤,請按照下列步驟操作:

  1. 啟用「追蹤工作階段」,並選擇下列其中一種做法:
    • 等待發生 500 Internal Server Error 錯誤,或
    • 如果可以重現問題,請發出 API 呼叫來重現問題 500 Internal Server Error
  2. 確認已啟用「顯示所有流程資訊」:

  3. 選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
  5. 錯誤通常會出現在「Target Request Flow Started」(目標要求流程已啟動) 階段之後的流程中,如下所示:

  6. 請注意追蹤記錄中的錯誤值:

    error: Invalid request path

    由於 Apigee Edge 是在「Target Request Flow Started」(啟動目標要求流程) 階段後引發錯誤,因此表示後端伺服器網址的路徑無效。如果 Apigee Edge 中的流程變數 target.url (代表後端伺服器的網址) 可能已透過目標要求流程中的其中一項政策更新為無效路徑,就最有可能發生這種情況。

  7. 從錯誤流程往回檢查每個流程中的「Variables Read and Assigned」部分,直到「Target Request Flow Started」階段為止。
  8. 判斷政策,其中流程變數 target.url 已更新:

    範例追蹤記錄:顯示 JavaScript 政策更新了流程變數 target.url:

    在上述範例追蹤記錄中,請注意名為 JS- SetTargetURL 的 JavaScript 政策中,流程變數 target.url 的值會更新如下: target.url : https://mocktarget.apigee.net?json

  9. 請注意,target.url 中的值包含下列元件:
    • 配置: https
    • authority: mocktarget.apigee.net
    • 路徑: ?json
  10. 由於路徑元件是以問號 (?) 開頭,而非正斜線 (/),因此您會收到 Invalid request path 錯誤。
  11. 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
  12. 向下捲動至「Phase Details - Error Headers」部分,然後判斷「X-Apigee-fault-code」和「X-Apigee-fault-source」的值,如下所示:

  13. 您會看到 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 存取記錄診斷錯誤,請按照下列步驟操作:

  1. 如果您是私有雲使用者,可以透過 NGINX 存取記錄判斷 HTTP 500 Internal Server Error 的金鑰資訊。
  2. 檢查 NGINX 存取記錄:

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

  3. 搜尋特定時間內是否有任何錯誤代碼為 500 的錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示 500。protocol.http.BadPath
  4. 如果發現任何 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.BadPath
    X-Apigee-fault-source target

    請注意,「X-Apigee-fault-code」和「X-Apigee-fault-source」的值分別為 protocol.http.BadPath 和 target ,表示這個錯誤是由於後端伺服器網址含有無效路徑所致。

原因:後端伺服器網址 (target.url) 的路徑無效

診斷

  1. 如「常見診斷步驟」一文所述,使用 API 監控、追蹤工具或 NGINX 存取記錄,找出 500 Internal Server Error 的錯誤代碼和錯誤來源。
  2. 如果「錯誤代碼」為 protocol.http.BadPath,且「錯誤來源」的值為 target,表示後端伺服器網址的路徑無效。
  3. 後端伺服器網址在 Apigee Edge 中以流程變數 target.url 表示。如果您嘗試使用目標要求流程中的任何政策 (在 Proxy/共用流程中),動態更新後端伺服器網址 (target.url),導致網址路徑無效,通常就會發生這項錯誤。

  4. 使用下列其中一種方法,判斷流程變數 target.url 是否確實有無效 路徑,以及其值的來源:

    追蹤記錄

    使用 Trace 工具

    如果您已擷取這項錯誤的追蹤記錄,請按照「使用追蹤記錄工具 」和

    1. 確認 target.url 的路徑是否無效,也就是開頭為半形問號 (?) 而非正斜線 (/)。
    2. 如果是,請找出修改或更新 target.url 值的政策,確認該值是否包含無效路徑。

      範例追蹤記錄:顯示 JavaScript 政策更新了流程變數 target.url

    3. 在上述範例追蹤記錄中,請注意 JavaScript 政策已修改或更新 target.url 的值,使其包含無效路徑。
    4. 請注意,target.url 包含下列元件:
      • 配置: https
      • authority: mocktarget.apigee.net
      • 路徑: ?json

      路徑開頭為問號 (?),而非正斜線 (/), 因此無效。

    記錄

    使用記錄伺服器中的記錄

    1. 如果沒有這個錯誤的追蹤記錄 (間歇性問題),請檢查您是否已使用 MessageLogging 或 ServiceCallout 等政策,將流程變數 target.url 的值相關資訊記錄到記錄伺服器。
    2. 如果您有記錄,請查看記錄並
      1. 確認 target.url 是否有路徑無效,以及
      2. 查看是否可以判斷哪個政策修改了 target.url,導致路徑無效

    API Proxy

    查看失敗的 API Proxy

    如果沒有這項錯誤的追蹤記錄或記錄檔,請檢查失敗的 API Proxy,判斷是哪個項目修改或更新流程變數 target.url,導致其中包含無效路徑。請檢查下列事項:

    • API Proxy 中的政策
    • 從 Proxy 叫用的任何共用流程
  5. 請仔細檢查修改或更新流程變數 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 + path
    • url = 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 元件為必要,且一律須以「/」開頭。因此,請按照下列步驟修正這個問題:

  1. 請確保後端伺服器網址 (以流程變數 target.url 表示) 一律具有有效路徑,且開頭一律為斜線 (/)。
    1. 在某些情況下,路徑中可能沒有資源名稱,請確保路徑至少有一個正斜線 (/)。
    2. 如果您使用任何其他變數來判斷流程變數 target.url 的值,請確保其他變數沒有無效路徑。
    3. 如果您執行任何字串作業來判斷流程變數 target.url 的值,請確保字串作業的結果或輸出內容沒有無效路徑。
  2. 在上述範例中,您可以按照下列說明修正這個問題:

    範例 #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);

    請確認您傳遞的是有效路徑,例如:要求標頭 Path 中的 /user,以修正這個問題,如下所示:

    要求範例:

    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 Proxy 名稱
    • 用於重現 500 Internal Server Error 的完整 curl 指令,以及錯誤代碼 protocol.http.BadPath
    • API 要求的追蹤記錄檔

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

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

    參考資料

    流程變數 - 目標