如何获取 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 hostnamelocalhost
. 这就是您要测试的对象吗?
我在写 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 存储桶?的主要内容,如果未能解决你的问题,请参考以下文章
将 no-cors 包含在标头中以获取 react.js 中的 json 内容时出现奇怪的错误
使用 Rails 和 React 时如何在标头中获取 JWT 令牌