您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會取得 502 Bad Gateway
的 HTTP 狀態碼,以及錯誤代碼 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 方法不允許的規格,原始伺服器「必須」在 405
回應中產生並傳送 Allow
標頭欄位,其中包含目標資源目前支援的方法清單。如果否,Apigee 會使用 502 Bad Gateway
和錯誤代碼 protocol.http.Response405WithoutAllowHeader
回應。
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
傳回 405 回應,但不允許來自後端伺服器的標頭 | 處理 API 要求的後端伺服器以 405 狀態碼回應,但不含 Allow 標頭。 |
Edge Public and Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者身分登入 Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
protocol.http.Response405WithoutAllowHeader
的儲存格,如下所示:錯誤代碼
protocol.http.Response405WithoutAllowHeader
的資訊如下所示:按一下「查看記錄」 ,然後展開其中一個失敗的要求來查看詳細資訊。
- 在「記錄檔」視窗中記下下列詳細資料:
- 狀態碼:
502
- Fault 資料來源:
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 會在要求傳送至後端伺服器後引發錯誤,因此表示後端伺服器傳送了不含Allow
標頭的405
回應狀態碼。- 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
在「階段詳細資料」面板中向下捲動至「錯誤 / 回應標頭」部分,確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
- 您將分別看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.Response405WithoutAllowHeader
和target
,表示這項錯誤是因為後端傳送沒有Allow
標頭的405
回應狀態碼所致。回應標頭 值 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
。 如果在 X-Apigee-fault-code 與
protocol.http.Response405WithoutAllowHeader
的值相符時發現任何502
錯誤,請檢查 X-Apigee-fault-code 的值。NGINX 存取記錄中的 502 錯誤示例:
上述 NGINX 存取記錄範例中的「X-Apigee- error-code」和「X-Apigee-fault-source」的值如下:
回應標頭 值 X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
X-Apigee-fault-source target
原因:來自後端伺服器的 405 回應,但沒有允許標頭
診斷
- 使用 API 監控、追蹤工具或 NGINX 存取記錄檔,按照常見診斷步驟的說明,判斷
502 Bad Gateway
的「Fault Code」和「Fault 來源」。 - 如果「Fault Code」為
protocol.http.Response405WithoutAllowHeader
,且 Fault Source 為target
值,就表示後端伺服器回應的是405
狀態碼,但不含Allow
標頭。因此,Apigee 會以502 Bad Gateway
傳回錯誤代碼protocol.http.Response405WithoutAllowHeader
。
解析度
請使用下列其中一種方法解決問題:
後端伺服器
選項 #1:修正後端伺服器以透過「Allow」標頭傳送 405 狀態碼:
透過納入
Allow
標頭中允許的方法清單,確保後端伺服器一律符合 RFC 7231 6.5.5: 405 不允許的方法規格,並與405
狀態碼一起傳送,如下所示:Allow: HTTP_METHODS
- 舉例來說,如果您的後端伺服器允許
GET
、POST
和HEAD
方法,您就必須確認Allow
標頭包含這些方法,如下所示:Allow: GET, POST, HEAD
錯誤處理
選項 #2:使用錯誤處理功能,透過 API Proxy 的「Allow」標頭傳送 405 狀態碼:
如果後端伺服器傳回不含 Allow
標頭的 405
狀態碼,您可以使用錯誤處理功能回應 API Proxy 提供的 405
狀態碼和 Allow
標頭,如下所示:
建立 AssignMessage 政策或 IncreaseFault 政策等政策,並將狀態碼設為
405
,其中含有Allow
標頭和自訂訊息。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
,以便在收到包含錯誤代碼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 錯誤
- 如果您是 Private Cloud 使用者,可以將屬性
HTTP.ignore.allow_header.for.405
更新為true
,以免 Apigee Edge 引發502
錯誤。即使後端伺服器以沒有Allow
標頭的回應,後端伺服器也使用教學指南: 在訊息處理器中設定 405 屬性的允許標頭。405
- 如果您是 公有雲使用者 ,請與 Apigee Edge 支援團隊聯絡
規格
Apigee 預期後端伺服器的 405 Method Not Allowed
回應以及 Allow
標頭,如以下規格所示:
規格 | |
---|---|
RFC 7231 第 6.5.5 節:405 不允許的方法 | |
RFC 7231 第 7.4.1 節:允許 |
注意事項
建議的解決方式是修正後端伺服器,以便傳送含有 Allow
標頭的 405
狀態碼,並遵循
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