502 閘道錯誤 - 回覆 405 (不含允許標頭)

查看 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 診斷錯誤:

  1. 以下列方法登入邊緣 UI 擔任適當角色
  2. 切換到您要調查問題的機構。

    機構下拉式清單
  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 根據「時間」繪製「Fault Code」指標。

  6. 選取含有錯誤程式碼的儲存格 protocol.http.Response405WithoutAllowHeader,如下所示:

  7. 錯誤代碼 protocol.http.Response405WithoutAllowHeader 的相關資訊 如下所示:

  8. 按一下「查看記錄」 ,然後展開其中一項失敗的要求,即可查看更多資訊。

  9. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.Response405WithoutAllowHeader
  10. 如果「Fault Source」target,且「Fault Code」protocol.http.Response405WithoutAllowHeader,表示後端 伺服器傳回 405 Method Not Allowed 狀態碼,但沒有 Allow 標頭。

追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用 追蹤工作階段,並
    • 等待 502 Bad Gateway 錯誤發生,或
    • 如果可以重現問題,請發出 API 呼叫以重現問題: 502 Bad Gateway 個錯誤
  2. 確保已啟用「Show all FlowInfos」

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗的部分。
  5. 錯誤通常會在「要求傳送至目標伺服器」後的流程中顯示 階段,如下所示:

  6. 記下追蹤記錄中的錯誤值。

    上述追蹤記錄範例將錯誤顯示為 Received 405 Response without Allow Header。要求傳送至後端後,Apigee 會引發錯誤 伺服器,就表示後端伺服器傳送了 405 回應狀態碼 但不含 Allow 標頭。

  7. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  8. 向下捲動至「Phase Details」中的「Error / Response Headers」部分 然後決定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

  9. 您會看到 X-Apigee-fault-codeX-Apigee-fault-source 的值為 protocol.http.Response405WithoutAllowHeadertarget, 表示這項錯誤是因為後端 405 回應狀態碼 (不含 Allow 標頭)。
    回應標頭
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

NGINX

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷 提供 HTTP 502 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄:

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

    其中: ORGORGPORT# 會以實際值取代。

  3. 搜尋是否有任何 502 錯誤和錯誤代碼 在特定時間範圍內protocol.http.Response405WithoutAllowHeader (如果 發生錯誤) 或出現任何要求失敗時 502
  4. 如果發現任何 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 回應不含允許後端伺服器標頭

診斷

  1. 判定 502 Bad Gateway 的「錯誤程式碼」和「錯誤來源」 使用 API 監控、追蹤工具或 NGINX 存取記錄檔 常見的診斷步驟
  2. 如果「Fault Code」protocol.http.Response405WithoutAllowHeader,且 Fault Source 的值為 target,表示後端伺服器 回應傳回 405 狀態碼,但不含 Allow 標頭。因此 Apigee 傳回 502 Bad Gateway 的錯誤代碼 protocol.http.Response405WithoutAllowHeader

解析度

請使用下列其中一種方法解決問題:

後端伺服器

方法 #1:修正後端伺服器,以透過 Allow 標頭傳送 405 狀態碼:

  1. 確保後端伺服器一律遵循規格要求 RFC 7231,6.5.5 節:405 不允許的方法,而且會在傳送時405狀態 加入在 Allow 標頭中可使用的方法清單 如下所示:

    Allow: HTTP_METHODS
    
  2. 舉例來說,如果您的後端伺服器允許 GETPOSTHEAD 方法,那麼您必須確保 Allow 標頭包含 方法如下:
    Allow: GET, POST, HEAD
    

錯誤處理

方法 #2:透過「錯誤處理」功能,從您的 API 透過「Allow」標頭傳送 405 狀態碼 Proxy:

如果後端伺服器傳回 405 狀態碼,但不含 Allow 標頭,您可以使用錯誤處理功能,以 405 狀態碼和 來自 API Proxy 的 Allow 標頭,如下所示:

  1. 建立政策,例如 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>
    
  2. 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>
    
  3. 將這些變更儲存至 API Proxy 的新修訂版本,並部署修訂版本。
  4. 發出 API 呼叫,驗證您是否取得 405 狀態碼 Allow 標頭。

設定屬性

選項 #3:在訊息處理器中設定屬性,防止 Apigee Edge 傳回 502 錯誤

  1. 如果您是 Private Cloud 使用者,可以更新屬性 由 HTTP.ignore.allow_header.for.405true 禁止 Apigee Edge 引發 502 錯誤,即使後端伺服器回應了 405 按照使用指南的說明,確認沒有 Allow 標頭的狀態碼: 為訊息處理器中的 405 屬性設定「忽略允許」標頭
  2. 如果您是 公用雲端使用者 ,請與 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
    

    其中: ORGORGPORT# 會以實際值取代。

  • 訊息處理器系統記錄
    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

參考資料

Apigee 中的錯誤處理方式