Php 缓存验证-浏览器不正确地验证缓存中的Cookie?

Php 缓存验证-浏览器不正确地验证缓存中的Cookie?,php,validation,caching,browser,cookies,Php,Validation,Caching,Browser,Cookies,我有以下情况: 用户向显示表单的页面A发出请求(服务器存储此页面的缓存) 用户将表单提交给用于表单提交的控制器 控制器在用户提交的数据中查找错误,设置cookie错误详细说明这些错误,并将用户重定向回页面a 页面A显示原始内容和错误(服务器存储此页面的缓存) 页面A删除错误cookie 这是可行的,但前提是我不使用系统中的缓存来访问页面A 问题是,在删除cookie后,浏览器向我的服务器发出一个没有cookie的请求,并得到一个304 Not Modified错误,因此,浏览器仍然显示有错误

我有以下情况:

  • 用户向显示表单的页面A发出请求(服务器存储此页面的缓存)
  • 用户将表单提交给用于表单提交的控制器
  • 控制器在用户提交的数据中查找错误,设置cookie错误详细说明这些错误,并将用户重定向回页面a
  • 页面A显示原始内容和错误(服务器存储此页面的缓存)
  • 页面A删除错误cookie
这是可行的,但前提是我不使用系统中的缓存来访问页面A

问题是,在删除cookie后,浏览器向我的服务器发出一个没有cookie的请求,并得到一个304 Not Modified错误,因此,浏览器仍然显示有错误的页面,而不是没有错误的页面(来自原始请求)。服务器正确存储缓存(对于有错误的页面和无错误的页面)

现在服务器基本上有两个缓存页面:页面A和有错误的页面A

浏览器的最后一个已知页面是有错误的页面A,由于cookie不再存在,它会向服务器请求一个有错误的页面A条件的页面,而不是有错误的页面A。但它认为304响应是关于有错误的页面A,而不是页面A。我甚至检查了浏览器发送的数据,它知道它通过错误cookie获得了有错误的页面A,但在没有cookie的情况下发出请求时接受304未修改。它不会根据创建时的条件验证自己的缓存

浏览器不使用其设置的cookies验证其缓存吗


在不为每个请求设置一些GET变量的情况下,是否有一种解决方法?另一种方法是告诉服务器永远不要缓存设置了此类错误状态的页面,但这将是一种攻击。

缓存控制:公共可能不是您想要的。Public本质上说,您使用的是静态的、全局可访问的数据。它不会因每个用户而改变。它是全局缓存,因为您声称数据是全局的

一旦您开始更改每个用户,缓存就会违反其假设。”“私人”更像是你想要的


然而,这意味着您得到的优秀中间人缓存更少。通过重新验证或适当使用不同的标题,您可能会找到一些折衷办法。

显然,解决方案是将此作为响应标题:

Vary: Cookie
这将在缓存引擎中考虑cookie

编辑:

不过也有一个问题:Chrome、Internet Explorer和Firefox都能正常工作,但Safari和Opera在存储和验证缓存时都会忽略“Vary”标题。

客户端会话(也称cookies)可能不足以满足此场景。。。
建议改为使用服务器端会话。即使可以使用不同的头文件-使用$\u会话,您将处于保存端。

但这不起作用,Public和Private之间的唯一区别是Private表示只有浏览器可以缓存,而使用Public时,每个人都可以缓存。我将其更改为Private,其行为与此相同(因为浏览器在发出请求时不请求缓存)。我在最初的问题中将它改为private只是为了确定。这是不正确的,服务器端会话仍然需要cookie才能工作,因此它有完全相同数量的问题。当然,在服务器端提供变量更方便,而不仅仅是在客户端的cookie中。例如:许多WordPress博客遭到黑客攻击,因为人们从inet咖啡馆(或其他公共计算机)登录,并使其客户端会话存储被劫持,因此这也是一个安全问题。根据这个问题,您的答案肯定是正确的-我只是想对这个场景提出问题。是的,使用cookie仅用于识别,并在服务器端的页面之间传递错误消息(使用$\会话)。最佳做法是分析具体需求,而不是在客户端存储任何超出要求的内容。这不能一概而论,因为它取决于应用程序以及它的可移植性。在我的WP示例中,它是这样实现的,以便在任何垃圾主机上运行,即使没有加载会话模块。