如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?

Posted

技术标签:

【中文标题】如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?【英文标题】:How to get CORS header for rails app to access aws s3 bucket? 【发布时间】:2016-11-15 14:49:08 【问题描述】:

我已下载 rack-cors gem,按照文档操作并尝试在我的 Amazon AWS s3 存储桶中配置 CORS 设置以接受来自我的站点的 GET 请求,但我的控制台中仍然出现相同的错误。

<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>https://[url]</AllowedOrigin>
        <AllowedOrigin>http://[url]</AllowedOrigin>
        <AllowedOrigin>http://localhost:3000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

XMLHttpRequest 无法加载 [audio_url_from_amazon]。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin [my_website_url] 不允许访问。

这方面的任何帮助都会很棒,因为我已经阅读了其他问题,但似乎仍然无法让正确的配置正常工作。

【问题讨论】:

当您写入存储桶时,您设置了什么权限?我使用了 s3 gem,我遇到了类似的问题,通过设置 record.acl = :public_read 解决了这个问题,但这是 gem 中的 dsl,所以我不确定如何手动滚动它的语法。 安装 gem 后,你在哪个文件中插入了代码@ruby_newbie I don't think CORS works with the magic hostname localhost. 这就是您要测试的对象吗? 我在写 s3 时添加了它。 def write(path, content) bucket = get_bucket record = bucket.objects.build(path) record.content = content record.acl = :public_read record.save end 我正在测试本地主机和实时站点,如果我可以让它在实时站点而不是本地主机 @sqlbot 上工作并不重要。 【参考方案1】:

这个问题很晚了,但是有同样的问题,虽然它看起来浏览器正在触发一个预检的 OPTIONS 请求,但 s3 CORS 将不允许 OPTION,因为它是一个 HTTP 概念。

我的解决方案是在 s3 CORS 配置中允许 PUT 请求...

<AllowedMethod>PUT</AllowedMethod>

这允许预检成功。

【讨论】:

【参考方案2】:

将 gem 'rack-cors' 添加到您的 gemfile,运行 bundle。 创建一个新的初始化程序 cors.rb。在此处添加以下代码

Rails.application.config.middleware.insert_before 0, 'Rack::Cors' do
   allow do
    origins '*'

  resource '*',
    headers: :any,
    methods: [:get]
  end
end

这应该可以解决您的问题。

【讨论】:

以上是关于如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 GET/POST 获取的标头以避免 CORS

AngularJS和rails cors标头不起作用

将 no-cors 包含在标头中以获取 react.js 中的 json 内容时出现奇怪的错误

使用 Rails 和 React 时如何在标头中获取 JWT 令牌

如何使用 Firebase 托管的 webapp 获取没有 CORS 标头的外部数据?

在 Angular 6 中将 CORS 标头添加到响应中