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へのアップロードは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
コメントを残す