Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3.1 and Http Page Caching

Given that Heroku Cedar doesn't have http caching provided by Varnish I would like to use Rack::Cache. I have been told that rails 3.1.1 have Rack::Cache active by default, I just need to make sure to have in the configuration:

config.action_controller.perform_caching = true

and I need to pick a cache store, for this experiment I'm using:

config.cache_store = :memory_store

In the action of the page I want to cache I've added the following lines:

response.header['Cache-Control'] = 'public, max-age=300'
response.header['Expires'] = CGI.rfc1123_date(Time.now + 300)

This code used to work fine with Varnish, the first request would return a 200 and the subsequent (for 5 mins) would return a 304.

This doesn't happen with Rails 3.1 and Heroku Cedar Stack. I do get those headers in the response but subsequent requests returns 200 instead of 304.

What am I doing wrong? Thank you.

like image 631
soulnafein Avatar asked Nov 18 '11 14:11

soulnafein


1 Answers

As you noted, the Cedar stack doesn't use Varnish. That means a web request will always hit the ruby server.

With that in mind, Rack::Cache will respect your headers and serve the cached content.

However, since the request is actually going past the http layer into the rails app, the response will always be 200 since the cache doesn't happen at the http layer anymore.

To confirm this is true, insert this in one of your cached actions:

<%= Time.now.to_i %>

Then, reload the page several times and you'll notice the timestamp won't change.

like image 184
leonardoborges Avatar answered Oct 15 '22 21:10

leonardoborges