Ruby on rails AmazonS3缓存音频文件

Ruby on rails AmazonS3缓存音频文件,ruby-on-rails,caching,amazon-web-services,amazon-s3,Ruby On Rails,Caching,Amazon Web Services,Amazon S3,我创建了新的音乐应用程序,并将所有mp3文件存储在AmazonS3上。在转到S3之前,我使用将它们存储在服务器文件系统本身上。它用于缓存文件,并且在连续重新加载页面时,并没有从服务器下载文件。但每次我加载页面时,它都会从S3下载文件。这不仅使我的应用程序速度变慢,而且对S3的每个请求都是金钱。 我找到了一些关于缓存控制的文档,并尝试了所有这些文档,但没有成功。我可能遗漏了什么。感谢您的帮助。谢谢 这是我在S3上上传mp3文件的代码。我使用带导轨的CarrierWave CarrierWave.c

我创建了新的音乐应用程序,并将所有mp3文件存储在AmazonS3上。在转到S3之前,我使用将它们存储在服务器文件系统本身上。它用于缓存文件,并且在连续重新加载页面时,并没有从服务器下载文件。但每次我加载页面时,它都会从S3下载文件。这不仅使我的应用程序速度变慢,而且对S3的每个请求都是金钱。 我找到了一些关于缓存控制的文档,并尝试了所有这些文档,但没有成功。我可能遗漏了什么。感谢您的帮助。谢谢

这是我在S3上上传mp3文件的代码。我使用带导轨的CarrierWave

CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider               => 'AWS',
      :aws_access_key_id      =>  MyAppConfig.config['aws']['aws_access_key'],
      :aws_secret_access_key  => MyAppConfig.config['aws']['aws_secret_key'],
    }
    config.fog_directory  = MyAppConfig.config['aws']['aws_bucket_name']
    config.fog_public     = false
    config.storage = :fog
    config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}
end
看看

使用更新元数据为S3上已上载的文件设置缓存控制:

1) 运行Bucket Explorer并使用您的凭据登录

2) 列出所有Bucket后,选择任意S3 Bucket

3) 它将列出所选S3 Bucket的所有对象

4) 选择任意文件,右键单击对象并选择“更新元数据”选项

5) 在元数据属性中添加键和值。输入键:“缓存控制”,值为:“最大年龄=(您希望从缓存访问对象的时间,以秒为单位)”

6) 点击保存按钮。它将元数据更新为所有选定S3对象上的缓存控制

Example to set max-age: For time limit of 15 days = 3600 * 24 * 15 = 1296000 sec. Set Key = “Cache-Control” value = “max-age=1296000”

注意:如果对象是HTML文件,则设置Key:“缓存控制”和value:max age=(您希望从缓存访问对象的时间,以秒为单位),必须重新验证“即Key:“缓存控制”value:max age=“2592000,必须重新验证”30天。“必须重新验证”字符串必须以秒为单位添加为值。

如果您使用的是已签名的URL(您在注释中称为已签名的URL),并且没有重用这些已签名的URL,则无法缓存这些请求

Amazon Web Services无法覆盖您的Web浏览器的内部缓存系统。如果两个URI是唯一的,如它们具有签名URL,则您的Web浏览器会将它们视为Internet上两个不同的资源

例如,让我们以:

http://www.example.com/song1.mp3
http://www.example.com/song2.mp3
这是两个独立的URI。即使
song1.mp3
song2.mp3
具有相同的
Etag
Content Length
HTTP响应头,它们仍然是两个不同的资源

如果我们仅仅改变它们的查询字符串,情况也是如此:

http://www.example.com/song1.mp3?a=1&b=2&c=3
http://www.example.com/song1.mp3?a=1&b=2&c=4
这仍然是两个独立的URI。它们不会为了缓存而相互引用。这是使用的原则


再多摆弄HTTP头也无法获得您正在寻找的缓存行为。

假设您已正确设置缓存控制头并且正在使用签名URL,则需要保留给定文件的签名URL,并在后续页面加载中重新呈现完全相同的URL


如果您尚未设置缓存控制标头,或者希望根据发出请求的用户对其进行更改,则可以在对URL进行签名之前设置这些标头:
&response cache control=value
&response expires=value

“it”从S3下载文件……什么是“it”浏览器?还是服务器?你是想把S3用作文件系统?你是在使用签名url吗?不确定,但我认为是的,url有一些密钥id和有效期。这可能是问题的关键。目前我无法找到权威来源来引用,但经验告诉我,(一些|所有)浏览器(通常总是)只要URL中有查询字符串,就忽略它们的本地缓存;也就是说,URL中的
将阻止浏览器使用其本地缓存,而总是尝试再次获取资源。是的,我认为你是对的,可能是这样。处理这种情况的理想方法是什么。我的意思是应该有一些请允许我将我的请求减少到S3。有什么想法吗?如果你能帮助我理解签名url和未签名url,那么我可能会决定是否可以使用未签名url,根据你的建议解决我的问题。AWS签名url看起来像
/song1.mp3?Expires=123&Signature=abc
,并且是按需生成的。如果你正在创建sig为每个请求添加URL,则这些URL不会被任何人缓存。您有两个选项来缓存对象:1)使对象的读取策略
公开
,以便每个人都可以通过
/song1.mp3
访问它,而无需查询字符串;2)创建一个系统来存储和管理已签名的URL,以便同一用户看到相同的已签名URLURL
/song1.mp3?Expires=123&Signature=abc
多次(一个更大的作业)。