如何在 Amazon S3 中配置 CORS 并使用 cURL 确认 CORS 规则?

上次更新日期:2021 年 12 月 7 日

我想允许跨源访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶中的资源,但收到错误消息。如何解决此问题?

简短描述

您可以使用 Amazon S3 控制台或 AWS Command Line Interface (AWS CLI) 将跨源资源共享 (CORS) 规则应用于存储桶。要在您的 Amazon S3 存储桶上测试 CORS 规则,请使用 cURL 命令。

解决方案

CORS 是一项 HTTP 功能,它使用标头允许浏览器显示 Web 服务器从其他来源请求的内容。如果您向未由 CORS 规则定义的 Amazon S3 存储桶发出跨源请求,则不会返回 CORS 标头。

例如:

curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Origin: example.com"

HTTP/1.1 200 OK
x-amz-id-2: Va106gWx1uUDGbouopXfpjvjHW0VXydI8/VGlraf/62f2vvxtI+iAnmu7lF4MK2B6CxuzReyfRI=
x-amz-request-id: QWNNX1Y0MWFM152H
Date: Thu, 04 Nov 2021 18:52:55 GMT
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55

如果 Web 服务器向网站发出了类似的请求,则从存储桶中检索的内容将不会显示在您的浏览器中。要允许您的内容显示,请在您的 Amazon S3 存储桶上配置 CORS 策略。正确配置 CORS 策略可确保返回适当的标头。您可以使用 Amazon S3 控制台或 AWS CLI 在存储桶上配置 CORS 规则。

使用 Amazon S3 控制台配置 CORS 规则

使用 Amazon S3 控制台在存储桶上配置 CORS 规则,请执行以下步骤:

1.    登录 AWS 管理控制台。

2.    打开 Amazon S3 控制台

3.    选择您的存储桶。

4.    选择 Permissions (权限)选项卡。

5.    在跨源资源共享窗格中,选择编辑

6.    在文本框中,输入要激活的 JSON CORS 规则:

Example:

[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "example.com"
        ],
        "ExposeHeaders": [
            "Access-Control-Allow-Origin"
        ]
    }
]

有关每个 CORS 规则元素或示例规则的更多信息,请参阅 CORS 配置

7.    选择保存

使用 AWS CLI 配置 CORS 规则

要使用 AWS CLI 在存储桶上配置 CORS 规则,请运行以下命令:

aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

测试 CORS 规则

要测试 CORS 规则,请使用 cURL 命令,如下所示:

curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Origin: example.com"

HTTP/1.1 200 OK
x-amz-id-2: d5Jsw1vCf8tR3cMdXrtcTKYgczU/1pjxahnrw7C6jU1fLo8py2Nv2kpeFs8pYPruVZg6Y3JuRUA=
x-amz-request-id: BMCCY18E58B3GBWV
Date: Thu, 04 Nov 2021 19:12:26 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Last-Modified: Thu, 04 Nov 2021 16:03:50 GMT
ETag: "cd4276d2cd5a2dc8ebcc1e04746680f6"
Accept-Ranges: bytes
Content-Type: text/html
Server: AmazonS3
Content-Length: 55

如果 CORS 规则配置正确,您将收到 200 OK 响应。

CORS 方法问题排查

您还可以使用 cURL 命令,通过添加 -H "Access-Control-Request-Method: <Method>" 标志来使用特定的 CORS 方法发出请求。此标志指定要测试的 CORS 方法。使用 --request OPTIONS 标志对请求执行启动前检查。

注意:Amazon S3 支持 GET、HEAD、PUT、POST 和 DELETE 方法。

curl -i http://mycorsbucket.s3.amazonaws.com/cors-test.html -H "Access-Control-Request-Method: POST" --request OPTIONS -H "Origin: example.com"
HTTP/1.1 403 Forbidden
x-amz-request-id: 190J4Q6222HA2KZ5
x-amz-id-2: 6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 19 Nov 2021 18:43:38 GMT
Server: AmazonS3

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessForbidden</Code><Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message><Method>POST</Method><ResourceType>OBJECT</ResourceType><RequestId>190J4Q6222HA2KZ5</RequestId><HostId>6oEci3qg88OeoLvBGwkN8K9AGdxyVela8ZKxftXMqyWrtZFfiKMrBwpTAeRiOth8amovJMtAAdA=</HostId></Error>

如果请求返回错误,请将所需的方法添加到存储桶的 CORS 规则中:

aws s3api put-bucket-cors --bucket mycorsbucket --cors-configuration '{"CORSRules" : [{"AllowedHeaders":["Authorization"],"AllowedMethods":["GET","HEAD","POST"],"AllowedOrigins":["example.com"],"ExposeHeaders":["Access-Control-Allow-Origin"]}]}'

测试更新后的 CORS 规则。如果您的方法按预期工作,您会收到以下响应:

curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Access-Control-Request-Method: POST" -X OPTIONS -H "Origin: example.com"
HTTP/1.1 200 OK
x-amz-id-2: Cx4kuM31KPVE19woEPRRYxF+85vEWkLk8+M0p6BIb72T550njMnmLtjqRgYzuxKelR0f+cxhFqI=
x-amz-request-id: QBSHV46QK43HGW15
Date: Fri, 19 Nov 2021 18:48:21 GMT
Access-Control-Allow-Origin: example.com
Access-Control-Allow-Methods: GET, HEAD, POST
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Server: AmazonS3
Content-Length: 0