HTTP缓存、用户身份验证和PHP

HTTP缓存、用户身份验证和PHP,php,http,caching,http-caching,Php,Http,Caching,Http Caching,我正在用PHP开发一些软件,我正在努力让它有效地利用HTTP缓存。然而,我最近遇到的一个问题是,在登录之后,在登录之前访问的页面会被缓存,并且不会像登录一样工作 如果PHP和客户机之间有HTTP缓存,这尤其是一个问题。如果我将缓存限制器设置为始终为“公共”,则页面可能会始终被缓存(甚至通过代理缓存)。如果我在未登录时将缓存限制器设置为“公共”,在登录时设置为“私有”,则我当前的问题可能仍会发生。如果我将缓存限制器设置为始终私有,那么代理缓存将毫无益处,并且我当前遇到的问题可能仍然会发生 这个问题

我正在用PHP开发一些软件,我正在努力让它有效地利用HTTP缓存。然而,我最近遇到的一个问题是,在登录之后,在登录之前访问的页面会被缓存,并且不会像登录一样工作

如果PHP和客户机之间有HTTP缓存,这尤其是一个问题。如果我将缓存限制器设置为始终为“公共”,则页面可能会始终被缓存(甚至通过代理缓存)。如果我在未登录时将缓存限制器设置为“公共”,在登录时设置为“私有”,则我当前的问题可能仍会发生。如果我将缓存限制器设置为始终私有,那么代理缓存将毫无益处,并且我当前遇到的问题可能仍然会发生


这个问题的理想解决方案是什么?是否有办法在用户登录后使web浏览器“重试”?对于代理缓存,我知道有一些方法可以基于传入的cookie进行缓存,因此我相信这可能会解决部分问题。但是,从web浏览器的角度来看,这个问题又如何呢?

这里没有一个很好的解决方案,但您有两个选择:

  • 无论用户是否登录,都要使页面完全相同 不是,通过使用AJAX通过JSON请求登录状态 服务
  • 不要缓存页面,只缓存脚本、样式和图像。浏览器缓存HTML只有在用户不断查看 相同的页面,不期望不同的结果。这是你的吗 用例?如果是,您可能已经在使用AJAX来提供 实时更新,实施起来可能不是一个巨大的飞跃 选项1

  • 必须重新验证
    代理重新验证
    是这里的神奇关键词吗?哦,我忘了
    必须重新验证
    。。。你可能是对的。不过,我相信它会导致nginx(作为缓存代理)不缓存。我该怎么办?我想在这里使用nginx。实际上,我错了。我仔细阅读了这个主题(因为我永远记不住这些),这只意味着缓存副本必须在副本过期后重新验证。哦,好吧。在此期间,我将做更多的研究。不过,谢谢你的努力。我只是想。。。您是否提供带有Expires/Last Modified标头的ETag?您可以使用登录用户的ID(或类似的ID)重新刷新ETag,或者干脆不为登录用户使用服务器ID。虽然我猜中间的攻击性代理可能仍然有问题。