3

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

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

例如:

  1. PUT /companies/Nintendo创建了一家名为“任天堂”的新公司
  2. GET /companies列出所有公司
  3. 每次创建新公司时,我都想使与GET /companies. 浏览器不会自动执行此操作,因为两者在不同的 URL 上运行。

这种Cache-Control机制不适合这种情况吗?我应该使用no-cachewithETag来代替吗?这种情况的最佳做法是什么?

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

4

2 回答 2

0

不,在 HTTP/1.1 中,您只能在响应对该资源的请求时使客户端对该资源的缓存无效。它可能是对 a或而不是 a的响应(有关详细信息PUT,请参阅RFC 7234,第 4.4 节)。POSTDELETEGET

如果您有需要客户确认他们拥有最新版本的资源,那么no-cache实体标签是一个理想的解决方案。

HTTP/2 允许推送缓存清除(HTTP/2 中的九件事 4. 缓存推送)。

于 2015-02-25T09:41:22.780 回答
-1

在您给出的链接中,“短语“使实体无效”意味着缓存将从其存储中删除该实体的所有实例,或者将它们标记为“无效”并且需要强制重新验证才能被为响应后续请求而返回。”。现在的问题是缓存在哪里?相信文章说的Cache就是服务器缓存。

我在 VC++ 中从事过一个项目,每当模型更改时,缓存都会更新。实现这一点需要一个编程逻辑实现。您提到的文章正确地说“HTTP 协议无法保证所有此类缓存条目都被标记为无效”HTTP 协议不能自行使缓存无效。

在我们的项目示例中,我们使用了发布订阅机制。甚至当 A 类的对象被更新/插入时,它也会被发布到总线上。控制器注册以监听总线上的对象。假设控制器对对象 A 的更改感兴趣,则无论何时更改和发布对象类型 B,它都不会被回调。当对象类型 A 确实发生更改并发布时,控制器 A 的侦听器功能会使用对象 A 的最新更改更新缓存。 GET /companies 的后续请求将从缓存中获取最新的。现在在更改对象 A 和使用最新更改刷新缓存之间存在时间间隔。为了避免在这个时间间隙中发生错误,对象在对象 A 更改之前被标记为脏。因此,介于这些时间之间的请求将等待脏标志被清除。

还有一个浏览器缓存。我记得 ETAG 用于验证这一点。ETAG 是资源的校验和。对于这个客户应该以某种方式保持旧的 ETAG 值。如果资源的校验和已更改,则发送带有 HTTP 200 的新资源,否则发送 HTTP 304(使用本地副本)。

[更新]

PUT /公司/任天堂

获取/公司

是两种不同的资源。当执行 PUT /companies/Nintendo 请求时,您的 /companies/Nintendo 的缓存只会被更新,而不是 /companies(我说的是客户端缓存)。假设您GET /companies/Nintendo下次调用,根据 http 标头返回响应。 GET /companies是一个全新的请求,因为它指向不同的资源。

现在的问题是 http 标头应该是什么?它纯粹是特定于应用程序的。假设它是我不会缓存的股票报价。假设它是我将缓存一段时间的新闻项目。您的参考链接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

于 2013-10-04T06:31:19.820 回答