[Rails6]Carrierwave,S3でCache-controlを設定する

Rails6と書いているが、それ以前でも可能なはず。

環境

Rails 6.0.3
carrierwave 2.1.0

背景

Page speed insightの診断で「静的なアセットと効率的なキャッシュ ポリシーの配信」が出てきて対応することになった。

対応方法

指摘されたファイルのメタデータに、Cache-ControlもしくはExpiresを設定する。
すでに運用しているサービスの場合は、Railsで配信するファイルと外部から配信するファイルの2つある。

Railsで配信するファイル

今回の検証した環境だと、ユーザーがアップロードするようなファイルは外部ストレージに保存しているので、assets以下に保存している画像が対象だった。

# config/environments/production.rb

Rails.application.configure do
  config.public_file_server.headers = {
    "Cache-Control" => "public, s-maxage=31536000, max-age=15552000",
    "Expires"       => 1.year.from_now.to_formatted_s(:rfc822)
  }
end

外部から配信するファイル

ユーザーからアップロードされる画像などがS3に保存するようにしていたので、上記の対応だけだとPSIで指摘されていた。

すでにアップロードされたファイル

・フォルダもしくはファイルにチェック
・アクション > メタデータの変更
・キー: Cache-Control, 値: public, s-maxage=31536000, max-age=15552000
・保存をクリック(すでに同じキーがある場合は上書きされる。)

S3 オブジェクトにメタデータを追加する方法 - Amazon Simple Storage Service
Amazon S3 オブジェクトにメタデータを追加する方法。

これからアップロードされるファイル

S3へのアップロードはCarrierwaveを使っているので、設定にfog_attributesを付け足す。

# lib/carrierwave/storage/fog.rb や config/initializers/carrierwave.rb など環境によって異なる


CarrierWave.configure do |config|
  config.fog_attributes = { 
    cache_control: "public, s-maxage=31536000, max-age=15552000",
    expires: 1.year.from_now.to_formatted_s(:rfc822)
  }
end

コメント