根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10,客户端必须在POST,PUT或DELETE请求后使与URL关联的缓存无效。
是否可以指示Web浏览器使任意URL的缓存无效,而不向其发出HTTP请求?
例如:
PUT /companies/Nintendo
创建了一家名为“Nintendo”的新公司GET /companies
列出所有公司GET /companies
关联的缓存无效。浏览器不会自动执行此操作,因为它们在不同的URL上运行。 Cache-Control
机制不适合这种情况吗?我应该使用no-cache
代替ETag
吗?这种情况的最佳做法是什么?
我知道我可以在下次no-cache
时通过GET /companies
,但这需要应用程序跟踪URL失效而不是将责任推送到浏览器。这意味着,我想在步骤1之后使URL无效,而不是必须保留此信息并在步骤2中应用它。任何想法?
答案 0 :(得分:0)
不,在HTTP / 1.1中,您可能只在响应对该资源的请求的资源中使资源的客户端缓存无效。它可能是对“PUT , POST
或DELETE
而不是GET
的回应(详见RFC 7234, section 4.4)。
如果您有一个资源,您需要客户确认他们拥有最新版本,那么no-cache
和实体标签是理想的解决方案。
HTTP / 2允许清除缓存(Nine Things to Expect from HTTP/2' 4.缓存推送')。
答案 1 :(得分:-1)
在您提供的链接中,“短语”使实体无效“意味着缓存将从其存储中删除该实体的所有实例,或者将这些实体标记为”无效“并且需要之前必须进行强制重新验证他们可以在随后的请求中返回。“现在的问题是缓存在哪里?我相信文章所讨论的Cache是服务器缓存。
我在VC ++中开展了一个项目,每当模型更改时,缓存都会更新。有一个编程逻辑实现来实现这一点。您提到的文章正确地说“HTTP协议无法保证所有此类缓存条目都标记为无效”HTTP协议无法自行使缓存无效。
在我们的项目示例中,我们使用了发布订阅机制。当更新/插入A类对象时,它将被发布到总线。控制器注册以侦听总线上的对象。假设控制器对对象A的更改感兴趣,只要对象类型B被更改和发布,它就不会被回调。确实更改并发布了对象类型A后,Controller A Listener函数使用对象A的最新更改更新缓存.GET /公司的后续请求将从缓存中获取最新信息。现在,在更改对象A和使用最新更改刷新的缓存之间存在时间差。为避免在此时间间隔发生错误,在对象A更改之前,对象被标记为脏。因此,在这些时间之间发出的请求将等待清除脏标志。
还有一个浏览器缓存。我记得ETAGS用于验证这一点。 ETAG是资源的校验和。对于此客户端应该以某种方式保持旧的ETAG值。如果资源的校验和已更改,则发送带有HTTP 200的新资源,否则将发送HTTP 304(使用本地副本)。
<强> [更新] 强>
PUT / companies / Nintendo
GET /公司
是两种不同的资源。当执行PUT / companies / Nintendo请求时,您的/ companies / Nintendo缓存只会被更新而不是/公司(我说的是客户端缓存)。假设您下次调用GET /companies/Nintendo
,基于http标头返回响应。 GET /companies
是一个全新的请求,因为它指向不同的资源。
现在问题是http标头应该是什么?它纯粹是应用程序特定的。假设它是我不会缓存的股票报价。假设它是NEWS项目我会缓存一段时间。您的参考链接http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
包含缓存http标头的所有详细信息。唯一没有提到的是ETag用法。 ETag可以具有资源的校验和。检查http://en.wikipedia.org/wiki/HTTP_ETag
并检查https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers