查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway
,錯誤訊息
將程式碼設為 protocol.http.Response405WithoutAllowHeader
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您也可能會看到下列錯誤訊息:
{ "fault":{ "faultstring":"Received 405 Response without Allow Header", "detail":{ "errorcode":"protocol.http.Response405WithoutAllowHeader" } } }
可能原因
如果後端伺服器傳回 405 Method Not Allowed
狀態,就會發生這個錯誤
不含 Allow
標頭的程式碼。
根據規格
RFC 7231 的第 6.5.5 節:405 Method Not Allowed,這是原始伺服器應有的類型
「必須」在 405
回應中產生並傳送Allow
標頭欄位,
列出目標資源目前支援方法。如果不是,Apigee 會回覆
502 Bad Gateway
和錯誤代碼 protocol.http.Response405WithoutAllowHeader
。
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
405 回應,但沒有允許來自後端伺服器的標頭 | 處理 API 要求的後端伺服器會傳回 405 狀態碼,但不含 Allow 標頭。 |
邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以下列方法登入邊緣 UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼的儲存格
protocol.http.Response405WithoutAllowHeader
,如下所示:錯誤代碼
protocol.http.Response405WithoutAllowHeader
的相關資訊 如下所示:按一下「查看記錄」 ,然後展開其中一項失敗的要求,即可查看更多資訊。
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
502
- 錯誤來源:
target
- 錯誤代碼:
protocol.http.Response405WithoutAllowHeader
。
- 狀態碼:
- 如果「Fault Source」為
target
,且「Fault Code」是protocol.http.Response405WithoutAllowHeader
,表示後端 伺服器傳回405 Method Not Allowed
狀態碼,但沒有Allow
標頭。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用
追蹤工作階段,並
- 等待
502 Bad Gateway
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫以重現問題:
502 Bad Gateway
個錯誤
- 等待
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗的部分。
錯誤通常會在「要求傳送至目標伺服器」後的流程中顯示 階段,如下所示:
記下追蹤記錄中的錯誤值。
上述追蹤記錄範例將錯誤顯示為
Received 405 Response without Allow Header
。要求傳送至後端後,Apigee 會引發錯誤 伺服器,就表示後端伺服器傳送了405
回應狀態碼 但不含Allow
標頭。- 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
向下捲動至「Phase Details」中的「Error / Response Headers」部分 然後決定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
- 您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.Response405WithoutAllowHeader
和target
, 表示這項錯誤是因為後端405
回應狀態碼 (不含Allow
標頭)。回應標頭 值 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
X-Apigee-fault-source target
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷
提供 HTTP
502
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
其中: ORG、ORG 和 PORT# 會以實際值取代。
- 搜尋是否有任何
502
錯誤和錯誤代碼 在特定時間範圍內protocol.http.Response405WithoutAllowHeader
(如果 發生錯誤) 或出現任何要求失敗時502
。 如果發現任何
502
錯誤,且 X-Apigee-fault-code 與protocol.http.Response405WithoutAllowHeader
值,然後決定 X-Apigee-fault-source. 的值。NGINX 存取記錄中的 502 錯誤示例:
上述 NGINX 存取記錄範例的項目 X-Apigee- fault-code 和 X-Apigee-fault-source:
回應標頭 值 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
X-Apigee-fault-source target
原因:405 回應不含允許後端伺服器標頭
診斷
- 判定
502 Bad Gateway
的「錯誤程式碼」和「錯誤來源」 使用 API 監控、追蹤工具或 NGINX 存取記錄檔 常見的診斷步驟。 - 如果「Fault Code」為
protocol.http.Response405WithoutAllowHeader
,且 Fault Source 的值為target
,表示後端伺服器 回應傳回405
狀態碼,但不含Allow
標頭。因此 Apigee 傳回502 Bad Gateway
的錯誤代碼protocol.http.Response405WithoutAllowHeader
。
解析度
請使用下列其中一種方法解決問題:
後端伺服器
方法 #1:修正後端伺服器,以透過 Allow 標頭傳送 405 狀態碼:
確保後端伺服器一律遵循規格要求 RFC 7231,6.5.5 節:405 不允許的方法,而且會在傳送時
405
狀態 加入在Allow
標頭中可使用的方法清單 如下所示:Allow: HTTP_METHODS
- 舉例來說,如果您的後端伺服器允許
GET
、POST
和HEAD
方法,那麼您必須確保Allow
標頭包含 方法如下:Allow: GET, POST, HEAD
錯誤處理
方法 #2:透過「錯誤處理」功能,從您的 API 透過「Allow」標頭傳送 405 狀態碼 Proxy:
如果後端伺服器傳回 405
狀態碼,但不含 Allow
標頭,您可以使用錯誤處理功能,以 405
狀態碼和
來自 API Proxy 的 Allow
標頭,如下所示:
建立政策,例如 AssignMessage 政策 或 flaFault 政策。 並使用
Allow
標頭和自訂欄位將狀態碼設為405
撰寫新的電子郵件訊息AssignMessage 政策範例以允許標頭傳送 405:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
在
TargetEndpoint
中建立FaultRule
,叫用政策 取得含有錯誤代碼的502
錯誤時protocol.http.Response405WithoutAllowHeader
。顯示 FaultRule 的 TargetEndpoint 設定範例:
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>
- 將這些變更儲存至 API Proxy 的新修訂版本,並部署修訂版本。
- 發出 API 呼叫,驗證您是否取得
405
狀態碼Allow
標頭。
設定屬性
選項 #3:在訊息處理器中設定屬性,防止 Apigee Edge 傳回 502 錯誤
- 如果您是 Private Cloud 使用者,可以更新屬性
由
HTTP.ignore.allow_header.for.405
至true
禁止 Apigee Edge 引發502
錯誤,即使後端伺服器回應了405
按照使用指南的說明,確認沒有Allow
標頭的狀態碼: 為訊息處理器中的 405 屬性設定「忽略允許」標頭。 - 如果您是 公用雲端使用者 ,請與 Apigee Edge 支援團隊聯絡
規格
Apigee 預期後端伺服器傳回 405 Method Not Allowed
回應
並包含下列規格的 Allow
標頭:
規格 | |
---|---|
RFC 7231,6.5.5 節:405 不允許的方法 | |
RFC 7231,7.4.1 節:允許 |
要點
建議的解決方式是修正後端伺服器,以便傳送 405
狀態碼
與 Allow
標頭搭配使用,並遵循規格
RFC 7231,6.5.5 節:405 不允許的方法。
如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。
必須收集診斷資訊
如果按照上述說明操作後仍無法解決問題,請收集下列資訊 ,然後與 Apigee Edge 支援團隊聯絡。
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令,用於重現502 Bad Gateway
: 錯誤代碼protocol.http.Response405WithoutAllowHeader
- API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 環境名稱
- API Proxy 組合
- API 要求的追蹤檔
NGINX 存取記錄
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
其中: ORG、ORG 和 PORT# 會以實際值取代。
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log