Ruby 机架::缓存/机架::Etag 304

Ruby 机架::缓存/机架::Etag 304,ruby,http,caching,rack,Ruby,Http,Caching,Rack,我使用Rack:Etag根据服务器的响应生成适当的Etag值,并且为了开发,我使用Rack::Cache来验证我期望发生的缓存是否真的发生了 但我有一个小小的困境: 我发送一个请求,并将这些头返回 Age →0 Cache-Control →public, max-age=10 Connection →keep-alive Content-Length →4895 Content-Type →application/json; charset=UTF-8 Date →Wed, 02 Oct 20

我使用Rack:Etag根据服务器的响应生成适当的Etag值,并且为了开发,我使用Rack::Cache来验证我期望发生的缓存是否真的发生了

但我有一个小小的困境:

我发送一个请求,并将这些头返回

Age →0
Cache-Control →public, max-age=10
Connection →keep-alive
Content-Length →4895
Content-Type →application/json; charset=UTF-8
Date →Wed, 02 Oct 2013 06:55:42 GMT
ETag →"dd65de99f4ce58f9de42992c4e263e80"
Server →thin 1.5.1 codename Straight Razor
X-Content-Digest →0879e41b0d8e9b351f517dd46823095e0e99abd8
X-Rack-Cache →stale, invalid, store
如果我在11秒后发送了一个新请求,其中If None Match=dd65de99f4ce58f9de42992c4e263e80,那么我希望得到一个304,但总是得到200,并带有上述头


我遗漏了什么?

可能是因为
max age
指令被设置为10

当缓存响应中存在max age cache control指令时,如果响应的当前期限大于新请求该资源时给定的期限值(以秒为单位),则该响应将过时


不过,你已经知道了吗?就像你在11秒后尝试的那样

我认为解决方案是按如下方式加载机架中间件,以实现直接链接

use Rack::Cache
use Rack::ConditionalGet
use Rack::ETag

如果没有匹配的话,也发送hash,我认为这看起来很脆弱,我已经知道了,但我认为如果缓存过时并发出新请求,它会比较etag,如果etag生成匹配的,则给出304,如果没有匹配的话。但在这里,我的知识非常有限:-)