CORS 疑難排解 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CORS 疑難排解

下列主題可協助您疑難排解一些與 S3 相關的常見CORS問題。

403 禁止錯誤:CORS此存儲桶未啟用

跨來源請求傳送至 Amazon S3,但CORS未在 S3 儲存貯體上設定時,會發生下列403 Forbidden錯誤。

錯誤:HTTP/1.1 403 禁止CORS回應:CORS此值區未啟用

CORS組態是一份文件或政策,其中包含規則,可識別您允許存取值區的來源、您將為每個來源支援的作業 (HTTP方法),以及其他特定於作業的資訊。了解如何使用 Amazon S3 主控台在 S3 CORS 上進行設定 AWS SDKs,以及RESTAPI。如需有關CORS組態的詳細資訊CORS和範例,請參閱CORS。

403 禁止錯誤:不允許此CORS請求

當設定中的CORS規則與要求中的CORS資料不符時,就會收到下列403 Forbidden錯誤。

錯誤:HTTP/1.1 403 禁止CORS回應:不允許此CORS要求

因此,發生此403 Forbidden錯誤的原因有多種:

  • 不允許使用原點。

  • 不允許使用方法。

  • 請求的標題是不允許的。

對於 Amazon S3 收到的每個請求,您的CORS組態中必須有符合請求中資料的CORS規則。

不允許使用原點

值區CORS要求中的Origin標頭必須與CORS組態中AllowedOrigins元素的來源相符。元素中的萬用字AllowedOrigins元 ("*") 會符合所有HTTP方法。如需如何更新AllowedOrigins元素的詳細資訊,請參閱設定跨來源資源共用 (CORS)

例如,如果AllowedOrigins元素中只包含http://www.example1.com網域,則從網http://www.example2.com域傳送的CORS要求就會收到403 Forbidden錯誤訊息。

下列範例顯示AllowedOrigins元素中包含http://www.example1.com網域的CORS組態的一部分。

"AllowedOrigins":[ "http://www.example1.com" ]

對於從http://www.example2.com域發送的CORS請求成功,該http://www.example2.com域應包含在CORS配置AllowedOrigins元素中。

"AllowedOrigins":[ "http://www.example1.com" "http://www.example2.com" ]

不允許使用方法

在值區的CORS要求Access-Control-Request-Method中指定的HTTP方法,必須與CORS組態中AllowedMethods元素中列出的方法相符。中的萬用字元 ("*") AllowedMethods 將符合所有HTTP方法。如需如何更新AllowedOrigins元素的詳細資訊,請參閱設定跨來源資源共用 (CORS)

在CORS配置中,您可以在AllowedMethods元素中指定以下方法:

  • GET

  • PUT

  • POST

  • DELETE

  • HEAD

下列範例顯示包含AllowedMethods元素中GET方法的一部分CORS組態。只有包括該GET方法的請求才會成功。

"AllowedMethods":[ "GET" ]

如果在CORS要求中使用了HTTP方法 (例如PUT),或包含在值區的預先執行CORS要求中,但該方法不在您的CORS組態中,則該要求將導致403 Forbidden錯誤。若要允許此CORS要求或CORS預先執行要求,此方PUT法必須新增至您的CORS設定中。

"AllowedMethods":[ "GET" "PUT" ]

請求的標題是不允許的

飛行前請求中標Access-Control-Request-Headers題中列出的標題必須與配置中AllowedHeaders元素中的標題相匹CORS配。如需 Amazon S3 請求中可使用的通用標頭清單,請參閱通用請求標頭。如需如何更新AllowedHeaders元素的詳細資訊,請參閱設定跨來源資源共用 (CORS)

下列範例顯示AllowedHeaders元素中包含Authorization標頭的CORS組態部分。只有對Authorization頭的請求才會成功。

"AllowedHeaders": [ "Authorization" ]

如果標頭(例如包含Content-MD5在CORS請求中,但標頭不存在於您的CORS配置中,則該請求將導致403 Forbidden錯誤。要允許此CORS請求,必須將Content-MD5標頭添加到您的CORS配置中。如果您想要將要CORS求中的AuthorizationContent-MD5標頭傳遞至值區,請確認兩個標頭都包含在CORS組態中的AllowedHeaders元素中。

"AllowedHeaders": [ "Authorization" "Content-MD5" ]

CORS回應中找不到標頭

CORS組態中的ExposeHeaders元素會識別您要讓哪些回應標頭可供瀏覽器中執行的指令碼和應用程式存取,以回應要CORS求。

如果存放在 S3 儲存貯體中的物件具有使用者定義的中繼資料 (例如,x-amz-meta-custom-header) 以及回應資料,則此自訂標頭可能包含您要從用戶端 JavaScript 程式碼存取的其他中繼資料或資訊。但是,默認情況下,出於安全原因,瀏覽器阻止訪問自定義標題。要允許客戶端 JavaScript 訪問自定義標題,您需要在CORS配置中包含標題。

在下面的例子中,x-amz-meta-custom-header1標題包含在ExposeHeaders元素中。x-amz-meta-custom-header2不包含在ExposeHeaders元素中,並且在CORS組態中遺失。在響應中,只有包含在ExposeHeaders元素中的值將被返回。如果請求在x-amz-meta-custom-header2標頭中包含標Access-Control-Expose-Headers頭,則響應仍然會返回一個200 OK. 但是,只有允許的頭,例如x-amz-meta-custom-header將返回並在響應中顯示。

"ExposeHeaders": [ "x-amz-meta-custom-header1" ]

為了確保所有頭出現在響應中,將所有允許的頭添加到CORS配置中的ExposeHeaders元素,如下所示。

"ExposeHeaders": [ "x-amz-meta-custom-header1", "x-amz-meta-custom-header2" ]

S3 代理整合CORS的注意事項

如果您遇到錯誤並已檢查 S3 儲存貯體上的CORS組態,且跨來源請求會傳送至 Proxy AWS CloudFront,請嘗試下列動作:

  • 配置設置以允許請HTTP求的OPTIONS方法。

  • 設定 Proxy 以轉寄下列標頭:OriginAccess-Control-Request-Headers、和Access-Control-Request-Method

某些 Proxy 會針對CORS要求提供預先定義的功能。例如,在中 CloudFront,您可以設定包含標頭的政策,以便在來源為 S3 儲存貯體時啟用CORS請求。如需詳細資訊,請參閱CloudFront 開發人員指南的使用原始要求與使用受管理的原始要求政