【问题标题】:Why is Rack::Cache not hitting cache when etag matches?为什么当 etag 匹配时 Rack::Cache 没有命中缓存?
【发布时间】:2010-03-05 09:25:31
【问题描述】:

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

第一个请求

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),这应该会命中缓存?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-01-17
        • 2021-05-01
        • 2012-04-27
        • 1970-01-01
        • 2018-09-16
        • 1970-01-01
        • 2012-12-16
        • 2022-01-18
        • 2012-06-05
        相关资源
        最近更新 更多