我创建了新的音乐应用程序,并将所有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
答案 0 :(得分:3)
如果您使用的是签名网址,即表示您在评论中而不是重复使用这些已签名的网址,则无法缓存这些请求。
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。出于缓存的目的,他们不会互相引用。这是使用query strings to override caching背后的原则。
无法摆弄HTTP标头,无法获得您正在寻求的缓存行为。
答案 1 :(得分:2)
使用更新元数据为S3上已经上传的文件设置缓存控制:
1)运行Bucket Explorer并使用您的凭据登录。
2)列出所有Buckets后,选择任何S3 Bucket。
3)它将列出所选S3 Bucket的所有对象。
4)选择任何文件并右键单击对象,然后选择“更新元数据”选项。
5)在元数据属性中添加键和值。输入密钥:“Cache-Control”,其值为:“max-age =(您希望以秒为单位从缓存访问对象的时间)”
6)单击“保存”按钮。它将在所有选定的S3对象上将元数据更新为Cache-Control。
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文件,请设置密钥:“Cache-Control”和值:max-age =(您希望以秒为单位从缓存访问对象的时间),必须重新验证“即密钥:“缓存控制”值:max-age =“2592000,必须重新验证”30天。 “必须重新验证”字符串必须在第二个时间后添加为值。
答案 2 :(得分:1)
假设您已正确设置缓存控制标头并且使用的是签名URL,则需要保留给定文件的签名URL,并在后续页面加载中重新呈现完全相同的URL。
如果您尚未设置缓存控制标头,或者您希望它们根据发出请求的人进行更改,则可以在使用以下网址对您的网址进行签名之前对其进行设置:&response-cache-control=value
或&response-expires=value
。