我有以下情况:
这样做有效,但前提是我没有在我的系统上使用缓存进行PAGE A.
问题是,在删除cookie之后,浏览器向我的服务器发出没有cookie的请求并获得304 Not Modified错误,因此,浏览器仍然显示包含错误的页面,而不是没有(来自原始请求)。服务器正确存储缓存(对于有错误的页面以及无错页面)。
服务器现在基本上有两个缓存页面:PAGE A和PAGE A WITH ERRORS。
浏览器,其最后一个已知页面是PAGE A WITH ERRORS要求服务器页面条件为PAGE A,而不是PAGE A WITH ERRORS,因为cookie不再存在。但是它认为304的响应是关于PAGE A WITH ERRORS,而不是PAGE A.我甚至检查了浏览器发送的数据,它知道它有错误的PAGE A带错误的PAGE A,但接受304时未修改没有cookie的请求。它不会根据在其下创建的条件验证自己的缓存。
没有浏览器使用已设置的Cookie验证其缓存吗?
有没有针对每个请求设置一些GET变量的解决方法?另一种方法是告诉服务器永远不要缓存具有这种ERRORS状态集的页面,但那将是一个黑客攻击。
答案 0 :(得分:2)
显然,解决方案是将其作为响应标题包含在内:
Vary: Cookie
这将在缓存引擎中考虑cookie。
编辑:
但是存在一个问题:Chrome,Internet Explorer和Firefox按预期工作,但Safari和Opera在存储和验证缓存时都忽略了“Vary”标头。
答案 1 :(得分:1)
客户端会话(a.k.a cookies)可能不足以满足这种情况...... 会建议服务器端会话。即使Vary标题可能起作用 - 使用$ _SESSION,你也可以保存。
答案 2 :(得分:0)
缓存控制:public可能不是你想要的。 Public基本上表示您正在处理静态的,全局可访问的数据。它不会因用户而改变。它在全球范围内缓存,因为您声称数据是全局的。
一旦您开始更改每个用户,缓存就会违反其假设。 “私人”更像是你想要的东西。
然而,这意味着您获得较少的中间人缓存。您可以通过重新验证或适当使用Vary标头来达到中间地位。