如何在 Amazon S3 中配置跨源资源共享 (CORS),并通过 cURL 确认 CORS 规则?

3 分钟阅读
0

我想允许跨源访问我的 Amazon Simple Storage Service(Amazon S3)桶中的资源,但我遇到了一个错误。

解决方法

您可以使用 Amazon S3 控制台或 AWS 命令行界面(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: http://www.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.    选择权限选项卡。

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

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

Example:

[
  {
    "AllowedHeaders": [
      "Authorization"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ],
    "AllowedOrigins": [
      "http://www.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":["http://www.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: http://www.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: http://www.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 方法进行故障排除

如果您在使用 CORS 配置访问桶时遇到意外行为,请尝试以下操作:

1.    通过添加 -H "Access-Control-Request-Method:" 标志,使用 cURL 命令利用特定 CORS 方法: <Method>发出请求。此标志指定要测试的 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: http://www.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>

2.    如果请求返回错误,请验证是否在桶上设置了 CORS 配置。请确保已将所需方法添加到桶上的 CORS 规则中。如果设置了 CORS 配置,则您将在 S3 控制台中桶的权限部分看到编辑 CORS 配置的选项。

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

3.    测试更新的 CORS 规则。如果您的方法按预期运行,那么您将收到以下响应:

curl -i http://mycorsbucket.s3.amazonaws.com/index.html -H "Access-Control-Request-Method: POST" -X OPTIONS -H "Origin: http://www.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: http://www.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

4.    使用您选择的工具捕获完整的请求和响应。对于 Amazon S3 收到的每个请求,您必须有一个 CORS 规则与请求中的数据相匹配。

  • 验证请求是否具有 Origin 标头。如果缺少标头,则 Amazon S3 不会将该请求视为跨源请求,也不会在响应中发送 CORS 响应标头。
  • 验证您的请求中的 Origin 标头是否与指定 CORSRule 中的至少一个 AllowedOrigins 元素相匹配。Origin 请求标头中的方案、主机和端口值必须与 CORSRule 中的 AllowedOrigins 元素相匹配。例如,假设您将 CORSRule 设置为允许源 http://www.example.com。当您这样做时,请求中的源 https://www.example.com 和 http://www.example.com:80 与配置中允许的源不匹配。
  • 验证您的请求或预检请求中的方法(在 Access-Control-Request-Method 中指定的方法)是否是同一 CORSRule 中的 AllowedMethods 元素之一。
  • 如果预检请求包含 Access-Control-Request-Headers 标头,请验证 CORSRule 是否包含 Access-Control-Request-Headers 标头中每个值的 AllowedHeader 条目。

相关信息

向 Amazon CloudFront 响应添加 HTTP 标头

如何解决 CloudFront 中的“请求的资源上不存在‘Access Control Allow Origin’标头”错误?

Amazon S3 如何评估桶上的 CORS 配置?

CORS 故障排除

AWS 官方
AWS 官方已更新 1 年前