Rack :: Cache / Rack :: Etag 304

时间:2013-10-02 06:58:38

标签: 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 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以上的标题。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

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

  

当缓存响应中存在max-age cache-control指令时,如果当前年龄大于新资源请求时给出的年龄值(以秒为单位),则响应过时。< / p>

虽然,你知道吗?正如你在11秒后尝试的那样!

答案 1 :(得分:1)

我认为解决方案是按照以下方式加载机架中间件以进行正确的链接

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

并且还发送If-None-Match with“”around hash,我认为这似乎很脆弱