被 CORS 策略阻止 - 来自 Django 应用程序的 S3 存储桶访问

Posted

技术标签:

【中文标题】被 CORS 策略阻止 - 来自 Django 应用程序的 S3 存储桶访问【英文标题】:Blocked by CORS Policy - S3 Bucket Access from Django App 【发布时间】:2017-12-20 14:08:12 【问题描述】:

我的应用程序访问 S3 存储桶中的字体文件时遇到问题。

这是我关于 S3 存储桶的 CORS 政策:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
    <ExposeHeader>ETag</ExposeHeader>
  </CORSRule>
</CORSConfiguration>

但在控制台中访问我的网站时,我得到以下信息:

已被 CORS 策略阻止:无“访问控制允许来源” 请求的资源上存在标头

【问题讨论】:

您已清除浏览器缓存?您能否从浏览器捕获带有标头的失败请求/响应并将其编辑到问题中? 同样的问题你是怎么解决的? 有人找到答案了吗? 我在下面添加了一个答案。 【参考方案1】:

我最终配置了一个 CloudFront 分配,将 Access-Control-Allow-Origin 列入白名单,源为 S3,并将 nginx 配置为包含正确的标头。

Origin 请求标头指示提取的来源。它不包含任何路径信息, 但只有服务器名称(例如https://www.example.com)。 详情请见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin。

在这里,我们设置了 Access-Control-Allow-Origin 响应标头中包含的值。如果源是我们已知的主机之一——通过 HTTP 或 HTTPS 提供服务——我们允许 CORS。否则,我们设置“null”值,禁止 CORS。

map $http_host $cors_origin 
default "null";
  "~*^\.example\.com$" "$http_x_forwarded_proto://$http_host";

【讨论】:

以上是关于被 CORS 策略阻止 - 来自 Django 应用程序的 S3 存储桶访问的主要内容,如果未能解决你的问题,请参考以下文章

来自 Vue 应用程序的发布请求被 CORS 策略阻止

访问被 CORS 策略阻止:没有“访问控制允许来源”

angularjs 7 Access-Control-Allow-Origin 被 cors 策略阻止

角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查

来自“http://localhost:8000”的 Laravel 8 已被 CORS 策略阻止

Google App Script Web App GET 和 POST 请求被 CORS 策略阻止