如何设置ActiveStorage磁盘服务的缓存控制



我有一个带有ActiveStorage的简单Rails 6应用程序。我使用本地磁盘存储。当我检查来自表示url的响应时,如

http://localhost:3000/rails/active_storage/disk/some-long-hash/IMG_0951.jpeg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22IMG_0951.jpeg%22%3B+filename%2A%3DUTF-8%27%27IMG_0951.jpeg

我看到标题缓存控制:最大年龄=0,私有,必须重新验证

问题是如何让Rails设置带有一定年龄的公共缓存头?

根据@anthermh的回答,这里是Rails 7.1的最新版本-在Zeitwerk之后,很难直接从初始化器调用控制器或模型。

# config/initializers/active_storage_cache_control.rb
Rails.application.reloader.to_prepare do
ActiveStorage::DiskController.class_eval do
before_action only: [:show] do
response.set_header('Cache-Control', 'max-age=86400, public')
end
end
end

ActiveStorage::DiskController#show方法很难覆盖,但可以覆盖。

一种更简单的方法是为现有的#show方法添加一个after_action回调,以便在调用时插入Cache-Control标头:

# config/initializers/active_storage.rb
require 'active_storage/current'
ActiveStorage::Current.url_options = { host: 'localhost', port: 3000 }
require 'active_storage/set_current'
require 'active_storage/base_controller'
require 'active_storage/file_server'
require 'active_storage/disk_controller'
class ActiveStorage::DiskController < ActiveStorage::BaseController
after_action do
response.set_header('Cache-Control', 'max-age=3600, public') if action_name == 'show'
end
end

请求ActiveStorage URL,然后在响应中返回自定义Cache-Control头值:

HTTP/1.1 200 OK
Cache-Control: max-age=3600, public
...

最新更新