AWS S3 存储桶 CORS 策略错误:请求的资源上不存在“Access-Control-Allow-Origin”标头

Voj*_*ach 6 amazon-s3 amazon-web-services cors


我是无服务器服务的新手,主要是 aws 概念。我正在尝试使用 AWS S3 Bucket 和 CloudFront 部署我的单页应用程序 (SPA)。每个静态文件都正确提供,但在 SPA 内部,有一些 axios.POST(...) 超出了我的 API 的原始页面。Api 配置正确,并且接受来自任何人的请求(经​​过测试)。
现在当我尝试时:

 curl -H "origin: ORIGIN_DOMAIN" -H "x-api-key: API_KEY" -v "API_URL"
Run Code Online (Sandbox Code Playgroud)

响应如预期(数据为 200 OK)

但是当我尝试加载 SPA 时,浏览器显示:

从源“http://d1b89hgibifv2r.cloudfront.net”访问“https://47zb0mpexk.execute-api.eu-south-1.amazonaws.com/default/autostatistika”处的 XMLHttpRequest 已被 CORS 策略阻止:响应预检请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我的 S3 存储桶 CORS 策略:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

我发现了一些 stackoverflow 问题,如下所示:Correct S3 + Cloudfront CORS Configuration? 并做了答案中的确切内容(以及aws文档中的内容):/sf/answers/3666833481/

请问,有人可以帮我解决这个问题吗?谢谢。

更新: 我忘记使用远程 API 的设置在本地计算机上尝试 SPA,并且我的应用程序无法工作,即使在本地计算机上也是如此。几个小时后,我发现我的 API 仅在使用 axios.POST() 的浏览器中不响应标头 'Access-Control-Allow-Origin': '*'。所以问题出在 API 中,因为即使 cURL 命令有效,它也无法正确响应标头“Access-Control-Allow-Origin”(AWS Lambda + API Gateway)。我通过在 AWS Lambda 的响应中硬编码标头解决了这个问题。感谢@vaquar khan,占用您的时间。

小智 5

[
  {
    "AllowedHeaders": [
        "*"
    ],
    "AllowedMethods": [
        "POST",
        "GET",
        "PUT"
    ],
    "AllowedOrigins": [
        "*"
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

在新的S3控制台中,CORS配置必须是JSON。


vaq*_*han 0

您需要更改配置以允许使用 ACL 的公共访问并添加以下配置

cors 配置:

        <?xml version="1.0" encoding="UTF-8"?>
        <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
        <CORSRule>
            <AllowedOrigin>http://www.myapp.com</AllowedOrigin>
            <AllowedMethod>GET</AllowedMethod>
            <AllowedMethod>POST</AllowedMethod>
            <AllowedMethod>PUT</AllowedMethod>
            <ExposeHeader>Accept-Ranges</ExposeHeader>
            <ExposeHeader>Content-Range</ExposeHeader>
            <ExposeHeader>Content-Encoding</ExposeHeader>
            <ExposeHeader>Content-Length</ExposeHeader>
            <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
            <AllowedHeader>*</AllowedHeader>
        </CORSRule>
        <CORSRule>
            <AllowedOrigin>https://www.app.com</AllowedOrigin>
            <AllowedMethod>GET</AllowedMethod>
            <AllowedMethod>POST</AllowedMethod>
            <AllowedMethod>PUT</AllowedMethod>
            <ExposeHeader>Accept-Ranges</ExposeHeader>
            <ExposeHeader>Content-Range</ExposeHeader>
            <ExposeHeader>Content-Encoding</ExposeHeader>
            <ExposeHeader>Content-Length</ExposeHeader>
            <ExposeHeader>Access-Control-Allow-Origin</ExposeHeader>
            <AllowedHeader>*</AllowedHeader>
        </CORSRule>
        </CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

s3-web-策略:

        {
          "Version":"2012-10-17",
          "Statement":[
            {
              "Sid":"AddPerm",
              "Effect":"Allow",
              "Principal": "*",
              "Action":["s3:GetObject"],
              "Resource":["arn:aws:s3:::dynamic-xxx-xxx-bucket/*"]
            }
          ]
        }
Run Code Online (Sandbox Code Playgroud)