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

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

  1. 適當角色的使用者身分登入 Edge UI
  2. 切換至您想要調查問題的機構。

    機構下拉式清單
  3. 前往「分析」>「API 監控」>「調查」頁面。
  4. 請選取你發現錯誤的特定時間範圍。
  5. 將「Fault Code」與「Time」進行比較。

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

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

  8. 按一下「查看記錄」 ,然後展開其中一個失敗的要求來查看詳細資訊。

  9. 在「記錄檔」視窗中記下下列詳細資料:
    • 狀態碼: 502
    • Fault 資料來源: 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 會在要求傳送至後端伺服器後引發錯誤,因此表示後端伺服器傳送了不含 Allow 標頭的 405 回應狀態碼。

  7. 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
  8. 在「階段詳細資料」面板中向下捲動至「錯誤 / 回應標頭」部分,確定 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

  9. 您將分別看到 X-Apigee-fault-codeX-Apigee-fault-source 的值為 protocol.http.Response405WithoutAllowHeadertarget,表示這項錯誤是因為後端傳送沒有 Allow 標頭的 405 回應狀態碼所致。
    回應標頭
    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. 如果在 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 回應,但沒有允許標頭

診斷

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

解析度

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

後端伺服器

選項 #1:修正後端伺服器以透過「Allow」標頭傳送 405 狀態碼:

  1. 透過納入 Allow 標頭中允許的方法清單,確保後端伺服器一律符合 RFC 7231 6.5.5: 405 不允許的方法規格,並與 405 狀態碼一起傳送,如下所示:

    Allow: HTTP_METHODS
    
  2. 舉例來說,如果您的後端伺服器允許 GETPOSTHEAD 方法,您就必須確認 Allow 標頭包含這些方法,如下所示:
    Allow: GET, POST, HEAD
    

錯誤處理

選項 #2:使用錯誤處理功能,透過 API Proxy 的「Allow」標頭傳送 405 狀態碼:

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

  1. 建立 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>
    
  2. TargetEndpoint 中建立 FaultRule,以便在收到包含錯誤代碼 protocol.http.Response405WithoutAllowHeader502 錯誤時叫用政策。

    顯示 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 呼叫,並驗證您正在取得含有 Allow 標頭的 405 狀態碼。

設定資源

選項 #3:設定訊息處理器中的屬性,避免 Apigee Edge 傳回 502 錯誤

  1. 如果您是 Private Cloud 使用者,可以將屬性 HTTP.ignore.allow_header.for.405 更新為 true,以免 Apigee Edge 引發 502 錯誤。即使後端伺服器以沒有 Allow 標頭的回應,後端伺服器也使用教學指南: 在訊息處理器中設定 405 屬性的允許標頭405
  2. 如果您是 公有雲使用者 ,請與 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
    

    其中: ORGORGPORT# 會替換為實際值。

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

參考資料

Apigee 的錯誤處理