在我嘗試調用 Amazon API Gateway API 時,收到錯誤 "No 'Access-Control-Allow-Origin' header is present on the requested resource"。我想要對此錯誤和來自 API Gateway 的其他 CORS 錯誤進行疑難排解。
簡短描述
在伺服器未傳回 CORS 標準所需的 HTTP 標頭時,會發生跨來源資源共用 (CORS) 錯誤。若要解決來自 API Gateway REST API 或 HTTP API 的 CORS 錯誤,您必須重新設定 API 以符合 CORS 標準。
**注意:**您必須在資源層級設定 CORS。使用 API Gateway 組態或後端整合,例如 AWS Lambda。
解決方法
除了 No 'Access-Control-Allow-Origin' header present 錯誤之外,您可以使用下列程序來疑難排解所有 CORS 錯誤。其他 CORS 錯誤包括 Method not supported under Access-Control-Allow-Methods header 和 No 'Access-Control-Allow-Headers' headers present。
由於下列任何一種原因,可能會發生 No 'Access-Control-Allow-Origin' header present 錯誤:
- 未使用可傳回所需 CORS 標頭的 OPTIONS 方法設定 API。
- 您沒有設定其他方法類型,例如 GET、PUT 或 POST,以傳回所需的 CORS 標頭。
- 未設定具有代理整合或非代理整合 的 API 來傳回所需的 CORS 標頭。
- 對於私有 REST API,會呼叫不正確的調用 URL。或者,流量不會路由到介面虛擬私有雲端 (VPC) 端點。
確認錯誤的原因
請執行下列動作:
- 在調用 API 時,建立 HTTP 封存 (HAR) 檔案。然後,檢查 API 回應中傳回的參數標頭以確認檔案錯誤的原因。
- 使用瀏覽器中的開發人員工具,來檢查失敗 API 請求中的請求和回應參數。
在失敗的 API 資源上設定 CORS
對於 REST API
遵循使用 API Gateway 主控台在資源上開啟 CORS 中的指示。
對於 HTTP API
遵循為 HTTP API 設定 CORS 中的指示。
在 API 資源上設定 CORS 時,選取下列選項:
對於 Gateway 回應,選取 DEFAULT 4XX 和 DEFAULT 5XX。在選取 DEFAULT 4XX 和 DEFAULT 5XX 後,即使請求未到達端點,API Gateway 也會以所需的 CORS 標頭回應。例如,如果請求包含不正確的資源路徑,API Gateway 仍然會回應 403 "Missing Authentication Token" 錯誤。
對於 Access-Control-Allow-Methods,如果尚未選取 OPTIONS,請選取它以及可用於 CORS 請求的所有其他方法,例如 GET、PUT 和 POST。API Gateway 主控台使用所需的 Access-Control-Allow 標頭設定 OPTIONS 方法的 200 回應,並覆寫重新設定的資源中的現有值。
設定 REST API 整合以傳回所需的 CORS 標頭
為了在其回應中傳送所需的 CORS 標頭,請設定您的後端 Lambda 函數或 HTTP 伺服器。必須在 Access-Control-Allow-Origin 標頭值中包含允許的網域作為清單。
對於代理整合,無法在 API Gateway 中設定整合回應來修改 API 後端傳回的回應參數。在代理整合中,API Gateway 會將後端回應直接轉送至用戶端。
對於非代理整合,必須手動在 API Gateway 中設定整合回應,以傳回所需的 CORS 標頭。使用 API Gateway 主控台設定 CORS,因為主控台會自動將所需的 CORS 標頭新增至已設定的資源。
(僅適用於私有 REST API) 檢查介面端點的私有 DNS 設定
對於私有 REST API,確定是否在關聯的介面 VPC 端點上啟用私有 DNS。
已啟用私有 DNS
使用私有 DNS 名稱從 Amazon Virtual Private Cloud (Amazon VPC) 中調用您的私有 API。
未啟用私有 DNS
您必須手動將流量從調用 URL 路由至 VPC 端點的 IP 地址。使用下列調用 URL (Route53 別名):
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
**注意:**使用用您的 API 值取代 rest-api-id、region、vpce-id 和 stage。如需詳細資訊,請參閱如何調用私有 API。
如果未啟用私有 DNS,則無法使用端點特定的公用 DNS 名稱從 Amazon VPC 中存取私有 API。此外,您無法使用 Host 標頭選項,因為瀏覽器的請求不允許 Host 標頭修改。
對於私有 API,您無法使用 x-apigw-api-id 自訂標頭,因為它會啟動未包含標頭的預檢 OPTIONS 請求。使用 x-apigw-api-id 標頭的 API 呼叫無法連上您的 API。
注意:確保 API 的 OPTIONS 方法中已關閉授權。
相關資訊
測試 CORS
使用 API Gateway 匯入 API 在資源上開啟 CORS