aws-sdk 抱怨缺少实际存在的 cors header
aws-sdk complains about a cors header missing that actually exists
将 webpack 用于 运行 开发服务器,我正在尝试列出 S3 存储桶中的项目并使用浏览器中的 javascript aws-sdk 控制台输出结果。
这样做时我得到这个错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://bucketname.s3.amazonaws.com/?list-type=2&max-keys=2. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
但是我在 webpack 开发服务器配置中设置了 header,证明是:
curl -I http://localhost:8080
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, content-type, Authorization
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 7170
Vary: Accept-Encoding
Date: Sat, 02 Dec 2017 16:15:04 GMT
Connection: keep-alive
所以我尝试了 * 一切:
HTTP/1.1 404 Not Found
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
如果 header 存在,但错误是说它丢失了,是否可能是授权之类的其他东西?
如果它确实是 header 设置,那么如果 header 确实存在,下一步应该怎么做?
更新****
1:在 S3 上添加 CORS 设置,尽管我相信 header 它的抱怨不会出现在 S3 上:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
此外,存储桶未 public 或未启用静态托管。
2:这有效:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
来自 URL 标记的答案
希望阅读本文能有所帮助:http://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html
如何设置 CORS,是否使用 xml 文件?
您在 S3 存储桶配置上设置了 CORS。登录 AWS 管理控制台。转到 S3 存储桶;在右边你找到选项
您的第一个示例不起作用的原因是这个 CORS 常见请求 Header:
<AllowedHeader>Authorization</AllowedHeader>
基本上,您编写 CORS 策略的方式是所有请求都需要授权 header 才能存在。示例:
Authorization: AWS AWSAccessKeyId:Signature
解决办法是改成:
<AllowedHeader>*</AllowedHeader>
How Does Amazon S3 Evaluate the CORS Configuration On a Bucket?
When Amazon S3 receives a preflight request from a browser, it
evaluates the CORS configuration for the bucket and uses the first
CORSRule rule that matches the incoming browser request to enable a
cross-origin request. For a rule to match, the following conditions
must be met:
- 请求的来源 header 必须与 AllowedOrigin 元素匹配。
- 请求方法(例如,GET 或 PUT)或 Access-Control-Request-Method header(如果是预检 OPTIONS 请求)必须是 AllowedMethod 元素之一。
- 预检请求中请求 Access-Control-Request-Headers header 中列出的每个 header 必须与 AllowedHeader 元素相匹配。
将 webpack 用于 运行 开发服务器,我正在尝试列出 S3 存储桶中的项目并使用浏览器中的 javascript aws-sdk 控制台输出结果。
这样做时我得到这个错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://bucketname.s3.amazonaws.com/?list-type=2&max-keys=2. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
但是我在 webpack 开发服务器配置中设置了 header,证明是:
curl -I http://localhost:8080
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, content-type, Authorization
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 7170
Vary: Accept-Encoding
Date: Sat, 02 Dec 2017 16:15:04 GMT
Connection: keep-alive
所以我尝试了 * 一切:
HTTP/1.1 404 Not Found
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: *
如果 header 存在,但错误是说它丢失了,是否可能是授权之类的其他东西?
如果它确实是 header 设置,那么如果 header 确实存在,下一步应该怎么做?
更新****
1:在 S3 上添加 CORS 设置,尽管我相信 header 它的抱怨不会出现在 S3 上:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
此外,存储桶未 public 或未启用静态托管。
2:这有效:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
来自 URL 标记的答案
希望阅读本文能有所帮助:http://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html
如何设置 CORS,是否使用 xml 文件?
您在 S3 存储桶配置上设置了 CORS。登录 AWS 管理控制台。转到 S3 存储桶;在右边你找到选项
您的第一个示例不起作用的原因是这个 CORS 常见请求 Header:
<AllowedHeader>Authorization</AllowedHeader>
基本上,您编写 CORS 策略的方式是所有请求都需要授权 header 才能存在。示例:
Authorization: AWS AWSAccessKeyId:Signature
解决办法是改成:
<AllowedHeader>*</AllowedHeader>
How Does Amazon S3 Evaluate the CORS Configuration On a Bucket?
When Amazon S3 receives a preflight request from a browser, it evaluates the CORS configuration for the bucket and uses the first CORSRule rule that matches the incoming browser request to enable a cross-origin request. For a rule to match, the following conditions must be met:
- 请求的来源 header 必须与 AllowedOrigin 元素匹配。
- 请求方法(例如,GET 或 PUT)或 Access-Control-Request-Method header(如果是预检 OPTIONS 请求)必须是 AllowedMethod 元素之一。
- 预检请求中请求 Access-Control-Request-Headers header 中列出的每个 header 必须与 AllowedHeader 元素相匹配。