如何在 Amazon S3 中配置跨源资源共享 (CORS),并通过 cURL 确认 CORS 规则?
我想允许跨源访问我的 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’标头”错误?
相关内容
- AWS 官方已更新 4 个月前
- AWS 官方已更新 3 个月前
- AWS 官方已更新 1 年前