7

Heroku Cedar には Varnish が提供する http キャッシングがないため、使用したいと思いますRack::Cache。Rails 3.1.1 はRack::Cacheデフォルトでアクティブになっていると言われましたが、構成に必ず含める必要があります。

config.action_controller.perform_caching = true

使用しているこの実験では、キャッシュ ストアを選択する必要があります。

config.cache_store = :memory_store

キャッシュしたいページのアクションで、次の行を追加しました。

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

このコードは Varnish で正常に動作していました。最初のリクエストは 200 を返し、その後 (5 分間) は を返します304

これは、Rails 3.1 と Heroku Cedar Stack では発生しません。応答でこれらのヘッダーを取得しますが、後続の要求は 304 ではなく 200 を返します。

私は何を間違っていますか?ありがとうございました。

4

1 に答える 1

11

ご指摘のとおり、Cedar スタックは Varnish を使用しません。つまり、Web リクエストは常に Ruby サーバーにヒットします。

これを念頭に置いて、Rack::Cache はヘッダーを尊重し、キャッシュされたコンテンツを提供します。

ただし、リクエストは実際には http レイヤーを通過して Rails アプリに送られるため、http レイヤーでキャッシュが発生しなくなるため、レスポンスは常に 200 になります。

これが正しいことを確認するには、キャッシュされたアクションの 1 つにこれを挿入します。

<%= Time.now.to_i %>

次に、ページを数回リロードすると、タイムスタンプが変更されないことがわかります。

于 2011-11-18T21:04:54.247 に答える