我有一个带有 ActiveStorage 的简单 Rails 6 应用程序。我使用本地磁盘存储。当我像这样检查来自表示网址的响应时
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
我看到标题 Cache-Control: max-age=0, private, Must-revalidate
问题是如何让Rails设置具有一定年龄的公共缓存标头?
的
ActiveStorage::DiskController
方法很难覆盖,但可以做到。
更简单的方法是为现有 after_action
方法添加
#show
回调,以在调用时插入 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
...
基于 @anothermh 的回答,这里是 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