您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 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 回應,但沒有 Allow 標頭 | 處理 API 要求的後端伺服器會傳回 405 狀態碼,但不含 Allow 標頭。 |
Edge 公有和私有雲使用者 |
常見的診斷步驟
請使用下列其中一種工具/技術診斷這項錯誤:
API Monitoring
如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:
- 以具備 適當角色的使用者身分登入 Edge UI。
切換至要調查問題的機構。
- 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
- 選取您觀察到錯誤的特定時間範圍。
繪製「錯誤代碼」與「時間」的關係圖。
選取含有故障代碼的儲存格,如下所示:
protocol.http.Response405WithoutAllowHeader
故障代碼
protocol.http.Response405WithoutAllowHeader的相關資訊會顯示如下:
按一下「查看記錄」 ,然後展開其中一個失敗的要求,即可查看更多資訊。
- 在「記錄」視窗中,記下下列詳細資料:
- 狀態碼:
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錯誤
- 等待發生
確認已啟用「顯示所有流程資訊」:
- 選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
通常在「Request sent to target server」(已將要求傳送至目標伺服器) 階段之後的流程中,就會出現錯誤,如下所示:
請記下追蹤記錄中的錯誤值。
上述範例追蹤記錄會將錯誤顯示為
Received 405 Response without Allow Header。由於 Apigee 是在要求傳送至後端伺服器後引發錯誤,因此表示後端伺服器傳送了405回應狀態碼,但沒有Allow標頭。- 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
向下捲動至「階段詳細資料」面板中的「錯誤 / 回應標頭」部分,然後判斷「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.Response405WithoutAllowHeaderX-Apigee-fault-source target
NGINX
如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:
- 如果您是私有雲使用者,可以透過 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.Response405WithoutAllowHeaderX-Apigee-fault-source target
原因:後端伺服器傳送 405 回應,但不含 Allow 標頭
診斷
- 使用 API 監控、追蹤工具或 NGINX 存取記錄,判斷
502 Bad Gateway的錯誤代碼和錯誤來源,如「常見診斷步驟」一文所述。 - 如果「Fault Code」為
protocol.http.Response405WithoutAllowHeader,且「Fault Source」的值為target,表示後端伺服器傳回405狀態碼,但沒有Allow標頭。因此,Apigee 會傳回502 Bad Gateway,並附上錯誤代碼protocol.http.Response405WithoutAllowHeader。
解析度
請使用下列其中一種方法解決問題:
後端伺服器
選項 1:修正後端伺服器,傳送 405 狀態碼和 Allow 標頭:
請確保後端伺服器一律遵守規格 RFC 7231 第 6.5.5 節:405 Method Not Allowed,並透過
405狀態 代碼傳送,方法是在Allow標頭中加入允許的方法清單,如下所示:Allow: HTTP_METHODS
- 舉例來說,如果後端伺服器允許
GET、POST和HEAD方法,則必須確保Allow標頭包含這些方法,如下所示:Allow: GET, POST, HEAD
錯誤處理
選項 2:使用錯誤處理機制,透過 API Proxy 傳送 405 狀態碼和 Allow 標頭:
如果後端伺服器傳回 405 狀態碼,但沒有 Allow 標頭,您可以透過錯誤處理,從 API Proxy 傳回 405 狀態碼和 Allow 標頭,如下所示:
建立政策,例如 AssignMessage 政策或 RaiseFault 政策,並將狀態碼設為
405,其中包含Allow標頭和自訂訊息。傳送 405 狀態碼並加上 Allow 標頭的 AssignMessage 政策範例:
<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,在收到錯誤代碼protocol.http.Response405WithoutAllowHeader的502錯誤時,會叫用政策。顯示 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 呼叫,並確認您收到含有
Allow標頭的405狀態碼。
設定資源
方法 3:在訊息處理器中設定屬性,防止 Apigee Edge 傳回 502 錯誤
- 如果您是 私有雲使用者,可以將
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 Method Not Allowed。
如果仍需要 Apigee 支援團隊協助,請參閱「 必須收集診斷資訊」。
必須收集診斷資訊
如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡。
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 用於重現
502 Bad Gateway的完整curl指令,並附上錯誤代碼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