如何为ActiveStorage Disk服务设置Cache-control?

问题描述 投票:0回答:2

我有一个带有 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设置具有一定年龄的公共缓存标头?

ruby-on-rails ruby rails-activestorage
2个回答
1
投票

#show

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
...

0
投票

基于 @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
© www.soinside.com 2019 - 2024. All rights reserved.