本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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求中的Authorization
和Content-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 以轉寄下列標頭:
Origin
Access-Control-Request-Headers
、和Access-Control-Request-Method
。
某些 Proxy 會針對CORS要求提供預先定義的功能。例如,在中 CloudFront,您可以設定包含標頭的政策,以便在來源為 S3 儲存貯體時啟用CORS請求。如需詳細資訊,請參閱CloudFront 開發人員指南中的使用原始要求與使用受管理的原始要求政策。