缓存验证 - 浏览器错误地验证缓存中的cookie?

时间:2012-05-08 06:37:14

标签: php validation caching browser cookies

我有以下情况:

  • 用户向PAGE A发出显示表单的请求(服务器存储此页面的缓存)
  • 用户将表​​单提交给用于表单提交的CONTROLLER
  • CONTROLLER在用户提交的数据中发现错误,设置详细说明的错误,并将用户重定向回PAGE A
  • PAGE A显示原始内容加上ERRORS(服务器存储此页面的缓存)
  • PAGE A删除ERRORS cookie

这样做有效,但前提是我没有在我的系统上使用缓存进行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状态集的页面,但那将是一个黑客攻击。

3 个答案:

答案 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标头来达到中间地位。