避免缓存http响应

时间:2012-03-27 06:40:59

标签: http caching http-headers client-server browser-cache

什么是避免任何类型的http数据缓存的权威解决方案?我们可以修改客户端和服务器 - 所以我认为我们可以在客户端和服务器之间拆分任务。

客户端可以向每个请求附加一个随机参数http://URL/path?rand=6372637263 - 我的感觉是只使用这种方式它不能100%工作 - 可能有一些智能代理,可以检测到...另一方面,我认为如果URL与前一个不同,代理不能简单地决定发回一些缓存的响应。

服务器上可以控制一堆HTTP标头:

Expires: Tue, 03 Jul 2001 06:00:00 GMT
Last-Modified: {now} GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache

对此有何评论,最佳方法是什么?

3 个答案:

答案 0 :(得分:43)

服务器端缓存控制标头应如下所示:

Expires: Tue, 03 Jul 2001 06:00:00 GMT
Last-Modified: {now} GMT
Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate

避免在客户端上重写URL,因为它会污染缓存,并导致其他奇怪的语义问题。此外:

  • 使用一个Cache-Control标头(请参阅rfc 2616),因为未定义多个条目的行为。第二个缓存控件中的MSIE特定条目也是at best redundant

  • no-store是关于数据安全性的。 (它只表示不写入磁盘 - 仍然允许缓存将响应存储在内存中。)

  • Pragma: no-cache在服务器响应中没有意义 - 它是一个请求标头,这意味着接收请求的任何缓存都必须将其转发到原点。

  • 同时使用Expires (http/1.0)cache-control (http/1.1)并不是多余的,因为代理只存在http / 1.0,或者会降级协议。

  • 从技术上讲,根据no-cache,最后修改的标题是多余的,但最好将其保留在那里。

  • 有些浏览器会在遇到无法识别的缓存控制标头后忽略后续指令 - 所以先将重要内容放在首位。

答案 1 :(得分:4)

添加标题

Cache-control: private

保证,gataway缓存不会缓存此类请求。

我想向您推荐Fabien Potencier关于缓存的讲座:http://www.slideshare.net/fabpot/caching-on-the-edge

答案 2 :(得分:0)

要禁用缓存,您应该使用

Expires: 0 

Cache-Control: no-store

如果您使用一个,则不应使用其他。