我刚刚在 s3 上创建了一个私有存储桶,用于包含用户个人资料图片。使用公共存储桶,所有图像都被正确缓存(以前的回形针配置具有相同的设置)。
我有以下神社初始化程序:
s3_options = {
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
region: ENV['AWS_REGION'],
bucket: ENV['S3_BUCKET_NAME']
}
Shrine.storages = {
cache: Shrine::Storage::FileSystem.new('tmp', prefix: 'uploads/cache'),
store: Shrine::Storage::S3.new(**s3_options)
}
Shrine.plugin :activerecord
Shrine.plugin :logging
Shrine.plugin :determine_mime_type
Shrine.plugin :cached_attachment_data
Shrine.plugin :restore_cached_data
Shrine.plugin :delete_promoted
Shrine.plugin :delete_raw
Shrine.plugin :remove_invalid
以及以下上传者:
class AvatarUploader < Shrine
plugin :pretty_location
plugin :processing
plugin :upload_options, store: {
acl: 'private',
cache_control: "max-age=604800",
}
end
CacheControl 在 s3 对象上正确设置为 1 周,并且在响应中可见。我注意到,在每个请求上,签名的 url 关于X-Amz-Signature哈希值都不同,这很可能导致缓存未命中(每个请求的 Etag 相同)。我认为这是它不起作用的原因,但我不知道如何在对象未过期的情况下使 X-Amz-Signature 相同。