Ruby on rails 为什么在etag匹配时Rack::Cache没有命中缓存?

Ruby on rails 为什么在etag匹配时Rack::Cache没有命中缓存?,ruby-on-rails,caching,http-headers,rack,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 缓存丢失,Rai

在服务器或客户端上没有缓存的情况下启动

第一个请求

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未修改,数据库未命中:

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

但是我觉得这应该会命中缓存,因为etag匹配(如果不匹配/etag)?

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

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

我的理解是,If None匹配和If Modified-Since头在浏览器缓存内容过期时发送(内容在浏览器缓存中的时间超过了缓存控制头中的maxage)。这允许您的应用程序验证内容是否仍然是新鲜的,如果是新鲜的,则使用新的maxage和与以前相同的Etag发送304。

据我所知,如果不匹配,并且如果修改,则在浏览器缓存内容过期时发送标头(内容在浏览器缓存中的时间超过了缓存控制标头中的最大值)。这允许应用程序验证内容是否仍然是新的,如果是,则发送带有新的最大值和与以前相同的Etag的304