选项请求的 AWS S3 CORS 403 错误
Posted
技术标签:
【中文标题】选项请求的 AWS S3 CORS 403 错误【英文标题】:AWS S3 CORS 403 Error with OPTIONS request 【发布时间】:2013-09-30 12:13:37 【问题描述】:我正在尝试通过 ajax 请求访问驻留在 S3 中的 html 文件,但出现 403 错误。
我在线阅读AWS,如果我这样做,我需要设置AWS CORS规则来修复403错误。
但是,我已经尝试了两天,但我没有任何运气。这是我的 CORS 配置:
<?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>
<ExposeHeader>XMLHttpRequest</ExposeHeader>
<AllowedHeader>x-csrftoken</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我的 HTTP 请求看起来像:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Access-Control-Request-He... x-csrftoken
Access-Control-Request-Me... GET
Connection keep-alive
Host xxxxxxxxx.cloudfront.net
Origin http://localhost:8000
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0
谁能帮我看看我错过了什么?
谢谢!
【问题讨论】:
原来问题不是 S3 而是 cloudfront。有人尝试将 CORS 配置从 S3 转发到云端吗? 这真是一件令人气愤的事情。配置 S3 存储桶应该不难。 【参考方案1】:对于那些来到这里403 on OPTIONS request of cross origin s3 access但没有找到他们想要的东西的人,也许我在这方面的经验可以提供帮助。
tldr; 浏览器旨在将 origin 设置为 null 在来自不同来源的 302 重定向
我在对存储桶上的资源进行预检请求时也遇到了 CORS 问题,如果直接浏览到该资源,则该资源是可用的。
我在存储桶上配置了 CORS,并使用了正确的可接受的标头和来源。类似于以下内容。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:8080</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
然后我收到一个错误
Access to XMLHttpRequest at 'https://[REDACTED].s3.amazonaws.com/[REDACTED]?AWSAccessKeyId=[REDACTED]' (redirected from '[REDACTED]') from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
在检查请求标头后,很明显,一个可疑的事情是 Origin 的值为“null”。
Access-Control-Request-Headers: authorization
Access-Control-Request-Method: GET
Origin: null
Referer: [REDACTED]
User-Agent: [REDACTED]
事实证明,由于安全问题,浏览器被设计为在来自不同来源的 302 重定向上将 origin 设置为 null。更多信息here。
除了不进行重定向外,没有其他解决方法。 我不得不重新设计正在执行重定向的后端资源,以提供直接访问 s3 bbject 的链接。
【讨论】:
【参考方案2】:HTTP 403 (Frobidden) 并不一定意味着您需要 CORS。一种选择是将所有请求都发送到云端(同一来源),并且在您的分发中,有多个来源和行为。例如:
Beavior -> Origin
/api/* -> my.api.com
/static/* -> my.s3.bucket
但是,如果您确实需要跨域请求,CORS 标头应该由 cloudfront 转发并具有相同的行为,在您的示例中,您可能希望对您允许的标头更加宽容(<AllowedHeader>*</AllowedHeader>
?)。但与 CLoudFront 或 S3 相比,这与浏览器行为的相关性更高。
【讨论】:
以上是关于选项请求的 AWS S3 CORS 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
AWS S3 getSignedUrl() 返回 403 禁止错误
来自 S3 CORS 的 AJAX GET 在预检选项上失败,出现 403
AWS S3 存储桶 CORS 策略错误:请求的资源上不存在“Access-Control-Allow-Origin”标头
请求的资源(AWS、API Gateway、S3、CORS)上不存在“Access-Control-Allow-Origin”标头