如何對 API Gateway API 的 CORS 錯誤進行疑難排解?

上次更新日期:2021 年 1 月 27 日

當我嘗試叫用 Amazon API Gateway API 時,收到錯誤「請求的資源上不存在 'Access-Control-Allow-Origin' 標頭」。我該如何對此錯誤進行疑難排解?

簡短描述

當伺服器未傳回 CORS 標準所需的 HTTP 標頭時,會發生跨來源資源共享 (CORS) 錯誤。若要解決 API Gateway REST APIHTTP API 中的 CORS 錯誤,請重新設定 API 以符合 CORS 標準。

如需有關為 REST API 啟用 CORS 的詳細資訊,請參閱為 REST API 資源啟用 CORS。對於 HTTP API,請參閱為 HTTP API 設定 CORS

注意:CORS 必須在資源層級啟用,並且可以使用 API Gateway 組態或後端整合來進行處理,例如 AWS Lambda

解決方案

以下範例顯示了如何對 ‘Access-Control-Allow-Origin’ 標頭不存在 CORS 錯誤進行疑難排解。但是,您可以使用類似的程序對所有 CORS 錯誤進行疑難排解。例如:Access-Control-Allow-Methods 標頭不支援該方法錯誤和 ‘Access-Control-Allow-Headers’ 標頭不存在錯誤。

注意:'Access-Control-Allow-Origin' 標頭不存在 錯誤可能出於以下任何原因發生:

  • API 未設定可傳回所需 CORS 標頭的 OPTIONS 方法。
  • 另一種方法類型 (例如 GETPUTPOST) 未設定為傳回所需的 CORS 標頭。
  • 具有代理整合非代理整合的 API 未設定為傳回所需的 CORS 標頭。
  • 對於私有 REST API,呼叫了錯誤的叫用 URL,或者流量未路由至界面 Virtual Private Cloud (VPC) 端點。

確認錯誤原因

可採用兩種方法透過 API Gateway 確認 CORS 錯誤的原因:

  • 在叫用 API 時建立 HTTP 封存 (HAR) 檔案。然後,透過檢查 API 回應中傳回的參數標頭,來確認檔案中的錯誤原因。
  • 使用瀏覽器中的開發人員工具,檢查失敗 API 請求的請求和回應參數。

在遇到錯誤的 API 資源上啟用 CORS

對於 REST API,請參閱使用 API Gateway 主控台在資源上啟用 CORS。對於 HTTP API,請參閱為 HTTP API 設定 CORS

重要提示:如果您為 HTTP API 設定 CORS,則 API Gateway 會自動傳送對預檢 OPTIONS 請求的回應,即使沒有為您的 API 設定 OPTIONS 路由。對於 CORS 請求,API Gateway 會將設定的 CORS 標頭新增至整合的回應中。

啟用 CORS 時,請確保執行以下操作:

  • 針對 Gateway Responses for <api-name> API,選中 DEFAULT 4XXDEFAULT 5XX 核取方塊。

注意:當您選擇這些預設選項時,API Gateway 會使用所需的 CORS 標頭進行回應,即使請求未到達端點亦是如此。例如,如果請求包含不正確的資源路徑,API Gateway 仍會回應 403「缺少身份驗證字符」錯誤

  • 針對 Methods (方法),選中 OPTIONS (選項) 方法的核取方塊 (如果尚未選中)。此外,選中可用於 CORS 請求的所有其他方法的核取方塊。例如:GETPUTPOST

注意:在 API Gateway 主控台中啟用 CORS,會向資源新增 OPTIONS (選項) 方法(如果尚不存在)。此外還會使用所需的 Access-Control-Allow-* 標頭,來設定 OPTIONS (選項) 方法的 200 回應。如果您已使用主控台啟用 CORS,再次啟用則會覆寫現有值。

設定您的 REST API 整合,以傳回所需的 CORS 標頭

設定您的後端 AWS Lambda 函數HTTP 伺服器,以在其回應中傳送所需的 CORS 標頭。若要傳回 Access-Control-Allow-Origin 中的網域清單,您必須設定後端,以將清單中的網域名稱作為標頭 Access-Control-Allow-Origin 的值來傳送。

重要提示:如果您使用代理整合,則無法在 API Gateway 中設定整合回應,來修改 API 後端傳回的回應參數。在代理整合中,API Gateway 會將後端回應直接轉發至用戶端。

如果您使用非代理整合請在 API Gateway 中手動設定整合回應以傳回所需的 CORS 標頭。

注意:針對具有非代理整合的 API,使用 API Gateway 主控台在資源上啟用 CORS,會自動將所需的 CORS 標頭新增至資源中。

檢查界面端點的私有 DNS 設定 (僅適用於私有 REST API)

針對私有 REST API,確定是否為關聯的界面 VPC 端點啟用了私有 DNS

如果為界面端點啟用了私有 DNS,請使用私有 DNS 名稱從您的 Amazon Virtual Private Cloud (Amazon VPC) 中呼叫您的私有 API,以避免 CORS 錯誤。

如果未啟用私有 DNS,請手動將流量從叫用 URL 路由至 VPC 端點的 IP 地址。

注意:無論是否啟用私有 DNS,都會使用下列叫用 URL:https://api-id.execute-api.region.amazonaws.com/stage-name。 確保將 api-idregionstage-name 的值替換為 API 所需的值。 

如需詳細資訊,請參閱如何叫用私有 API

重要提示:如果在未啟用私有 DNS 的情況下啟用 CORS,請記住以下限制:

  • 您不能使用端點特定的公有 DNS 名稱,從您的 Amazon VPC 中存取您的私有 API。
  • 您不能使用 Host 標頭選項,因為瀏覽器的請求不允許 Host 標頭操作。
  • 您不能使用 x-apigw-api-id 自訂標頭,因為它會觸發不包含標頭的預檢 OPTIONS 請求。使用 x-apigw-api-id 標頭的 API 呼叫不會連線您的 API。

此文章是否有幫助?


您是否需要帳單或技術支援?