🐈

Cache-Control: public にする

2024/04/29に公開

Railsアプリケーションで、特定のページのみCDNやブラウザにキャッシュさせたい場合、Cache-Control: public ヘッダーの付与と、応答に Session Cookie が含まれないようにします。

サンプルコード

app/controllers/concerns/enable_cache.rb
module EnableCacheControlPublic
  extend ActiveSupport::Concern

  included do
    before_action -> do
      # このリクエストはSessionを使わないし、応答にも含めない
      request.session.clear
      request.session_options[:skip] = true
      # Cache-Control: max-age=3600, public
      expires_in 1.hour, public: true
    end
  end
end
app/controllers/posts_controller.rb
class PostsController < ApplicationController
  include EnableCacheControlPublic

  def show
    @post = Post.find(params[:id])
  end
end

このようにすることで安全にキャッシュさせることができます。

参考

https://github.com/rails/rails/blob/v7.1.3.2/actionpack/lib/action_dispatch/request/session.rb

https://github.com/rails/rails/blob/v7.1.3.2/activestorage/app/controllers/concerns/active_storage/disable_session.rb

https://github.com/rails/rails/blob/v7.1.3.2/actionpack/lib/action_controller/metal/conditional_get.rb

タケユー・ウェブ株式会社

Discussion