您目前查看的是 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 節:路徑:
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 公有和私有雲使用者 |
常見的診斷步驟
請使用下列其中一種工具/技術診斷這項錯誤:
API Monitoring
程序 1:使用 API Monitoring
如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:
- 以具備 適當角色的使用者身分登入 Apigee Edge UI。
切換至要調查問題的機構。
- 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
- 選取您觀察到錯誤的特定時間範圍。
繪製「錯誤代碼」與「時間」的關係圖。
選取含有故障代碼
protocol.http.BadPath的儲存格,如下所示:
故障代碼
protocol.http.BadPath的相關資訊會顯示如下:
按一下「查看記錄」 ,然後展開失敗要求的資料列。
- 在「記錄」視窗中,記下下列詳細資料:
- 狀態碼:
500 - 錯誤來源:
target - 故障代碼:
protocol.http.BadPath
- 狀態碼:
- 如果「Fault Source」為
target,且「Fault Code」為protocol.http.BadPath,表示後端伺服器網址的路徑無效。
追蹤記錄
程序 #2:使用追蹤工具
如要使用「追蹤」工具診斷錯誤,請按照下列步驟操作:
- 啟用「追蹤工作階段」,並選擇下列其中一種做法:
- 等待發生
500 Internal Server Error錯誤,或 - 如果可以重現問題,請發出 API 呼叫來重現問題
500 Internal Server Error
- 等待發生
確認已啟用「顯示所有流程資訊」:

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

請注意追蹤記錄中的錯誤值:
error: Invalid request path
由於 Apigee Edge 是在「Target Request Flow Started」(啟動目標要求流程) 階段後引發錯誤,因此表示後端伺服器網址的路徑無效。如果 Apigee Edge 中的流程變數
target.url(代表後端伺服器的網址) 可能已透過目標要求流程中的其中一項政策更新為無效路徑,就最有可能發生這種情況。- 從錯誤流程往回檢查每個流程中的「Variables Read and Assigned」部分,直到「Target Request Flow Started」階段為止。
- 判斷政策,其中流程變數
target.url已更新:範例追蹤記錄:顯示 JavaScript 政策更新了流程變數
target.url:
在上述範例追蹤記錄中,請注意名為
JS- SetTargetURL的 JavaScript 政策中,流程變數target.url的值會更新如下:target.url : https://mocktarget.apigee.net?json - 請注意,
target.url中的值包含下列元件:- 配置:
https - authority:
mocktarget.apigee.net - 路徑:
?json
- 配置:
- 由於路徑元件是以問號 (
?) 開頭,而非正斜線 (/),因此您會收到Invalid request path錯誤。 - 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
向下捲動至「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.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- 搜尋特定時間內是否有任何錯誤代碼為
500的錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示500。protocol.http.BadPath 如果發現任何
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 監控、追蹤工具或 NGINX 存取記錄,找出
500 Internal Server Error的錯誤代碼和錯誤來源。 - 如果「錯誤代碼」為
protocol.http.BadPath,且「錯誤來源」的值為target,表示後端伺服器網址的路徑無效。 後端伺服器網址在 Apigee Edge 中以流程變數
target.url表示。如果您嘗試使用目標要求流程中的任何政策 (在 Proxy/共用流程中),動態更新後端伺服器網址 (target.url),導致網址路徑無效,通常就會發生這項錯誤。使用下列其中一種方法,判斷流程變數
target.url是否確實有無效 路徑,以及其值的來源:追蹤記錄
使用 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 Proxy
查看失敗的 API Proxy
如果沒有這項錯誤的追蹤記錄或記錄檔,請檢查失敗的 API Proxy,判斷是哪個項目修改或更新流程變數
target.url,導致其中包含無效路徑。請檢查下列事項:- API Proxy 中的政策
- 從 Proxy 叫用的任何共用流程
- 確認
請仔細檢查修改或更新流程變數
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);
請確認您傳遞的是有效路徑,例如:要求標頭
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
參考資料