如何使任意URL的缓存无效?

时间:2013-10-04 04:32:44

标签: ajax http rest cache-control

根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10,客户端必须在POST,PUT或DELETE请求后使与URL关联的缓存无效。

是否可以指示Web浏览器使任意URL的缓存无效,而不向其发出HTTP请求?

例如:

  1. PUT /companies/Nintendo创建了一家名为“Nintendo”的新公司
  2. GET /companies列出所有公司
  3. 每次创建新公司时,我都希望使与GET /companies关联的缓存无效。浏览器不会自动执行此操作,因为它们在不同的URL上运行。
  4. Cache-Control机制不适合这种情况吗?我应该使用no-cache代替ETag吗?这种情况的最佳做法是什么?

    我知道我可以在下次no-cache时通过GET /companies,但这需要应用程序跟踪URL失效而不是将责任推送到浏览器。这意味着,我想在步骤1之后使URL无效,而不是必须保留此信息并在步骤2中应用它。任何想法?

2 个答案:

答案 0 :(得分:0)

不,在HTTP / 1.1中,您可能只在响应对该资源的请求的资源中使资源的客户端缓存无效。它可能是对“PUT , POSTDELETE而不是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