AWS S3 CORS 403 OPTIONS请求出错

时间:2013-09-25 03:45:49

标签: ajax amazon-web-services amazon-s3 http-status-code-403

我正在尝试从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

任何人都可以帮我看看我错过了什么吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

对于那些因跨源s3访问的OPTIONS请求而来到这里 403 的人,或者找不到他们想要的东西,也许我的经验会有所帮助。

tldr; 浏览器旨在将来自其他来源的302重定向中的 origin 设置为 null

在对存储桶中的资源进行预检请求时,我也遇到了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重定向中的设置为。更多信息here

除了不进行重定向以外,没有其他解决方法。 我不得不重新设计进行重定向的后端资源,以提供直接访问s3 bbject的链接。

答案 1 :(得分:0)

HTTP 403(Frobidden)并不一定意味着您需要CORS。一种选择是将所有请求发送到云端(相同来源),并在您的分发中提供多个来源和行为。例如:

Beavior   ->  Origin

/api/*    ->  my.api.com
/static/* ->  my.s3.bucket

但是,如果您确实需要跨源请求,则CORS标头应该由cloudfront转发并具有相同的行为,在您的示例中,您可能希望更宽松地使用您允许的标头(<AllowedHeader>*</AllowedHeader>?) 。但这与浏览器行为的关系比CLoudFront或S3更为重要。