在哪里设置图像的缓存信息?
Where do I set cache information for my images?
这是关于 Heroku
上的一个 Rails
应用程序,它在 CloudFront
之后运行并提供来自 Bucketeer
附加组件的 ActiveStorage
个图像。
Rails
应用程序本身和 CloudFront
中的缓存配置都针对 css
、js
甚至是关键的重要请求(如搜索结果) ,从 API 等获取的第 3 方信息)。
我不知道如何缓存来自 Bucketeer
附加组件的图像。
目前图像似乎每次都来自 Bucketeer
存储桶。它们显示时没有缓存 TTL。
我希望它们在 CloudFront 级别和访问者的浏览器级别缓存长达一年。
这可能吗?
似乎 Bucketeer
附加组件本身无法控制存储桶 and/or 服务如何处理缓存。
我在哪里可以使用缓存指令强制显示这些文件?
经过大量搜索,我得知 Bucketeer
确实提供了存储桶控制。你只需要使用 AWS CLI
.
这是 CLI
上 link 到 AWS
的文档:
https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html
这里是 link,其中 Bucketeer
告诉您如何开始使用他们的服务:
https://devcenter.heroku.com/articles/bucketeer#using-with-the-aws-cli
这意味着您可以安装 AWS CLI
,使用 Bucketeer
提供的凭据执行 aws configure
,然后直接在存储桶中更改 cache-control
。
AWS
似乎没有为整个存储桶或文件夹设置 cache-control
默认值的功能,因此您实际上对每个 object.
就我而言,存储桶中的所有 files/objects 都是我在网站上显示并需要缓存的图像,因此 运行 一次执行所有操作的命令是安全的.
这样的命令可以在这个答案中找到:
How to set expires headers to all images in a bucket in Amazon S3
对我来说,它看起来像这样:
aws s3 cp s3://my-bucket-name s3://my-bucket-name --recursive --acl public-read --metadata-directive REPLACE --cache-control max-age=43200000
该命令基本上将整个存储桶复制到自身,同时将 cache-control max-age=43200000
header 添加到过程中的每个 object。
这适用于所有现有文件,但不会为将来的更改或添加更改任何内容。您必须经常 运行 再次执行此操作才能捕获新内容 and/or 编写代码以在将 object 保存到桶。显然有些人对此很幸运。不是我。
谢天谢地,我找到了这个 post:
https://www.neontsunami.com/posts/caching-variants-with-activestorage
这个 monkey-patch 基本上改变了 ActiveStorage::RepresentationsController#show
以使用 Rails
变体的动作缓存。看一看。如果您遇到类似问题,值得一读。
有缺点。就我而言,它们不是问题,所以这就是我采用的解决方案。
感谢您在这里分享您的发现
此外,我发现 S3Service
接受上传选项
https://github.com/rails/rails/blob/6-0-stable/activestorage/lib/active_storage/service/s3_service.rb#L12
因此您可以将以下代码添加到您的 storage.yml
s3:
service: S3
access_key_id: ID
secret_access_key: KEY
region: REGION
bucket: BUCKET
upload:
cache_control: 'public, max-age=31536000'
有关可用选项的完整列表,请参阅 AWS SDK
这是关于 Heroku
上的一个 Rails
应用程序,它在 CloudFront
之后运行并提供来自 Bucketeer
附加组件的 ActiveStorage
个图像。
Rails
应用程序本身和 CloudFront
中的缓存配置都针对 css
、js
甚至是关键的重要请求(如搜索结果) ,从 API 等获取的第 3 方信息)。
我不知道如何缓存来自 Bucketeer
附加组件的图像。
目前图像似乎每次都来自 Bucketeer
存储桶。它们显示时没有缓存 TTL。
我希望它们在 CloudFront 级别和访问者的浏览器级别缓存长达一年。
这可能吗?
似乎 Bucketeer
附加组件本身无法控制存储桶 and/or 服务如何处理缓存。
我在哪里可以使用缓存指令强制显示这些文件?
经过大量搜索,我得知 Bucketeer
确实提供了存储桶控制。你只需要使用 AWS CLI
.
这是 CLI
上 link 到 AWS
的文档:
https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html
这里是 link,其中 Bucketeer
告诉您如何开始使用他们的服务:
https://devcenter.heroku.com/articles/bucketeer#using-with-the-aws-cli
这意味着您可以安装 AWS CLI
,使用 Bucketeer
提供的凭据执行 aws configure
,然后直接在存储桶中更改 cache-control
。
AWS
似乎没有为整个存储桶或文件夹设置 cache-control
默认值的功能,因此您实际上对每个 object.
就我而言,存储桶中的所有 files/objects 都是我在网站上显示并需要缓存的图像,因此 运行 一次执行所有操作的命令是安全的.
这样的命令可以在这个答案中找到: How to set expires headers to all images in a bucket in Amazon S3
对我来说,它看起来像这样:
aws s3 cp s3://my-bucket-name s3://my-bucket-name --recursive --acl public-read --metadata-directive REPLACE --cache-control max-age=43200000
该命令基本上将整个存储桶复制到自身,同时将 cache-control max-age=43200000
header 添加到过程中的每个 object。
这适用于所有现有文件,但不会为将来的更改或添加更改任何内容。您必须经常 运行 再次执行此操作才能捕获新内容 and/or 编写代码以在将 object 保存到桶。显然有些人对此很幸运。不是我。
谢天谢地,我找到了这个 post: https://www.neontsunami.com/posts/caching-variants-with-activestorage
这个 monkey-patch 基本上改变了 ActiveStorage::RepresentationsController#show
以使用 Rails
变体的动作缓存。看一看。如果您遇到类似问题,值得一读。
有缺点。就我而言,它们不是问题,所以这就是我采用的解决方案。
感谢您在这里分享您的发现
此外,我发现 S3Service
接受上传选项
https://github.com/rails/rails/blob/6-0-stable/activestorage/lib/active_storage/service/s3_service.rb#L12
因此您可以将以下代码添加到您的 storage.yml
s3:
service: S3
access_key_id: ID
secret_access_key: KEY
region: REGION
bucket: BUCKET
upload:
cache_control: 'public, max-age=31536000'
有关可用选项的完整列表,请参阅 AWS SDK