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

您目前查看的是 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 監控功能診斷錯誤,請按照下列步驟操作:

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

    機構下拉式選單
  3. 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
  4. 選取您觀察到錯誤的特定時間範圍。
  5. 繪製「錯誤代碼」與「時間」的關係圖。

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

  7. 故障代碼 protocol.http.Response405WithoutAllowHeader 的相關資訊會顯示如下:

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

  9. 在「記錄」視窗中,記下下列詳細資料:
    • 狀態碼: 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. 確認已啟用「顯示所有流程資訊」

  3. 選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
  5. 通常在「Request sent to target server」(已將要求傳送至目標伺服器) 階段之後的流程中,就會出現錯誤,如下所示:

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

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

  7. 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
  8. 向下捲動至「階段詳細資料」面板中的「錯誤 / 回應標頭」部分,然後判斷「X-Apigee-fault-code」和「X-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. 如果您是私有雲使用者,可以透過 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-codeprotocol.http.Response405WithoutAllowHeader 的值相符,請判斷 X-Apigee-fault-source 的值。

    NGINX 存取記錄中的 502 錯誤範例:

    上述 NGINX 存取記錄檔的範例項目,X-Apigee-fault-codeX-Apigee-fault-source 的值如下:

    回應標頭
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

原因:後端伺服器傳送 405 回應,但不含 Allow 標頭

診斷

  1. 使用 API 監控、追蹤工具或 NGINX 存取記錄,判斷 502 Bad Gateway錯誤代碼錯誤來源,如「常見診斷步驟」一文所述。
  2. 如果「Fault Code」protocol.http.Response405WithoutAllowHeader,且「Fault Source」的值為 target,表示後端伺服器傳回 405 狀態碼,但沒有 Allow 標頭。因此,Apigee 會傳回 502 Bad Gateway,並附上錯誤代碼 protocol.http.Response405WithoutAllowHeader

解析度

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

後端伺服器

選項 1:修正後端伺服器,傳送 405 狀態碼和 Allow 標頭:

  1. 請確保後端伺服器一律遵守規格 RFC 7231 第 6.5.5 節:405 Method Not Allowed,並透過 405 狀態 代碼傳送,方法是在 Allow 標頭中加入允許的方法清單,如下所示:

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

錯誤處理

選項 2:使用錯誤處理機制,透過 API Proxy 傳送 405 狀態碼和 Allow 標頭:

如果後端伺服器傳回 405 狀態碼,但沒有 Allow 標頭,您可以透過錯誤處理,從 API Proxy 傳回 405 狀態碼和 Allow 標頭,如下所示:

  1. 建立政策,例如 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>
  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. 如果您是 私有雲使用者,可以將 HTTP.ignore.allow_header.for.405 屬性更新為 true,防止 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 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

    說明: ORGORGPORT# 會替換為實際值。

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

參考資料

Apigee 中的錯誤處理