为什么在etag匹配时Rack :: Cache没有达到缓存?

时间:2010-03-05 09:25:31

标签: ruby-on-rails caching http-headers rack

从服务器或客户端上没有缓存开始

第一次请求

GET /post/1 HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 05 Mar 2010 09:05:46 GMT
Last-Modified: Thu, 04 Mar 2010 21:00:08 GMT
X-Rack-Cache: miss
Etag: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=3600, public

错过了缓存并且Rails被点击并查询数据库:

if stale?(:etag => @document, :last_modified => @document.updated_at.utc) # => true
  expires_in 1.hour, :public => true
  @post = Post.find(params[:id])
end

第二次请求

GET /post/1 HTTP/1.1
If-Modified-Since: Thu, 04 Mar 2010 21:00:08 GMT
If-None-Match: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=0

HTTP/1.1 304 Not Modified
Date: Fri, 05 Mar 2010 09:10:04 GMT
X-Rack-Cache: miss
Etag: "c226165d5817af7c91592dab0bc0ac63"
Cache-Control: max-age=3600, public

错过了缓存并且Rails被命中,但是这次它发送304 Not Modified并且没有命中数据库:

if stale?(:etag => @document, :last_modified => @document.updated_at.utc) # => false
  expires_in 1.hour, :public => true
  @post = Post.find(params[:id])
end

然而,由于etag匹配(If-None-Match / Etag),我认为这应该会达到缓存?

2 个答案:

答案 0 :(得分:4)

我正在进行全面刷新(F5),因此浏览器正在添加Cache-Control:max-age = 0这会阻止缓存认为页面是新鲜的。

答案 1 :(得分:0)

我的理解是,当浏览器的缓存内容到期时(内容已经在浏览器的缓存中超过Cache-Control标头中的maxage),将发送If-None-Match和If-Modified-Since标头。这允许您的应用程序验证内容是否仍然是新鲜的,如果是,则发送304使用新的maxage和相同的Etag。