Amazon S3缓存音频文件

pra*_*ech 5 caching ruby-on-rails amazon-s3 amazon-web-services

我创建了新的音乐应用程序,并将所有mp3文件存储在Amazon S3上.在转移到S3之前,我将它们存储在服务器文件系统本身上.它用于缓存文件,并且连续重新加载的页面文件未从服务器下载.但是每次加载页面后转到S3都会从S3下载文件.这不仅使我的应用程序变慢,而且对S3的每个请求都是金钱.我找到了一些关于缓存控制的文档,我尝试了所有这些但没有成功.我可能会在这里遗漏一些东西.任何帮助表示赞赏.谢谢.

这是我在S3上上传mp3文件的代码.我使用CarrierWave和Rails.

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
Run Code Online (Sandbox Code Playgroud)

Jac*_*din 3

如果您使用的是签名 URL(您在评论中说过),并且没有重复使用这些签名 URL,则无法缓存这些请求。

Amazon Web Services 无法覆盖您的 Web 浏览器的内部缓存系统。当两个 URI 是唯一的(就像它们带有签名 URL 一样)时,您的 Web 浏览器会将它们视为 Internet 上的两个不同资源。

例如,我们假设:

http://www.example.com/song1.mp3
http://www.example.com/song2.mp3
Run Code Online (Sandbox Code Playgroud)

这是两个离散的 URI。即使song1.mp3song2.mp3具有相同的EtagHTTPContent-Length响应标头,它们仍然是两个不同的资源。

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

http://www.example.com/song1.mp3?a=1&b=2&c=3
http://www.example.com/song1.mp3?a=1&b=2&c=4
Run Code Online (Sandbox Code Playgroud)

它们仍然是两个独立的 URI。它们不会出于缓存目的而相互引用。这就是使用查询字符串覆盖缓存的原理。

无论对 HTTP 标头进行多少修改,都无法获得所需的缓存行为。