当前位置: 首页 > 知识库问答 >
问题:

AWS S3 CORS 403 选项请求出错

董高朗
2023-03-14

我试图从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个答案

农均
2023-03-14

HTTP 403 (Frobidden)并不一定意味着你需要CORSs。一种选择是将所有请求发送到cloudfront(相同的来源),在您的发行版中,有几个来源和行为。例如:

Beavior   ->  Origin

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

但如果您确实需要跨源请求,CORS标头应该由cloudfront转发并具有相同的行为,在您的示例中,您可能希望对允许的标头更加宽容(

相温文
2023-03-14

对于那些因OPTIONS请求跨源s3访问而来到这里的403并且没有找到他们想要的东西的人,也许我的经验可以提供帮助。

tldr浏览器被设计成将来自不同来源的302重定向的来源设置为空

我还遇到了一个CORS问题,即对bucket上的资源的飞行前请求,如果直接浏览该资源,则该资源是可用的。

我在存储桶上配置了具有正确接受的标头和源的 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.

在检查了请求标头后,很明显,一个可疑的事情是值为“null”的 Origin。

Access-Control-Request-Headers: authorization
Access-Control-Request-Method: GET
Origin: null
Referer: [REDACTED]
User-Agent: [REDACTED]

事实证明,由于安全问题,浏览器被设计为将来自不同来源的302重定向的来源设置为null。更多信息请点击这里。

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

 类似资料:
  • 问题内容: 作为此问题的后续,我想知道如何在Spring 3 MVC应用程序中处理OPTIONS请求。我不想在我的spring代码中为每个端点编写一个选项处理方法。但是建议的将选项处理程序映射到“ / **”仅适用于尚未具有处理程序的端点。 因此,我想到了使用mvc拦截器来拦截OPTIONS请求以处理跨站点访问的问题。但我无法想象这是做到这一点的最佳方法。是否还有其他选项,例如在同一路径上具有不同

  • 我目前对tslint有意见,希望有人能给我指出正确的方向。 我正在尝试使用Angular2框架提供的HTTP发送HTTP GET请求。对于这个请求,我必须指定内容类型和承载身份验证令牌。 我的代码示例: 然而,tslint抱怨说 “TS2345:类型为{headers:headers;}的参数”不可分配给“RequestOptionsArgs”类型的参数。属性“headers”的类型不兼容。类型“

  • 我尝试使用angular2通过Oauth2身份验证访问我的Spring Boot应用程序。当我用基本身份验证(包括用户名和密码)向“oauth/token”发送post请求以获取token(在postman中可以正常工作)时,我得到了一个401未经授权。我知道我的浏览器用OPTIONS方法发送飞行前请求,我已经实现了我的安全配置,因此它应该忽略并允许OPTIONS请求,但它不起作用。 以下是我的安

  • 我阅读了很多关于这个问题的线程和解决方案(包括这个SO解决方案),但在发送预飞行请求时仍然有403错误。 我使用的是Spring Data Rest,只要没有发送选项,我就可以很好地处理我的存储库。我还没有使用Spring Security,但我计划很快配置它。以下是我当前的配置:

  • 我的web客户端应用程序正在通过FetchAPI设置HTTP POST请求。 我看到选项飞行前请求是通过调试代理(Charles proxy)发送的,但它们不会显示在Google Chrome Developer Tools\Network选项卡中。 我没有在“网络”选项卡上设置任何过滤器。我记得选项请求在那里是可见的,但不再是了。我怎么把它们带回来?

  • 我是AngularJS的新手。我正在使用AngularJS 1.3.15版本。当我尝试使用PUT方法调用api时,它正在生成OPTIONS请求。我不知道我在哪里做错了。我尝试了很多Stockoverflow中建议的方法,但仍然没有得到任何东西。请帮助我解决这个问题。下面是我的控制器、模型、html文件和Chrome开发人员工具网络活动截图。 控制器文件users.js 模型文件-users.js