什么是避免任何类型的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
对此有何评论,最佳方法是什么?
答案 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
如果您使用一个,则不应使用其他。