为什么即使在发送无缓存标头后页面仍然缓存?

时间:2012-08-30 03:35:31

标签: php javascript google-chrome caching dygraphs

我对此进行了大量研究,并向许多人提出了帮助,但仍然没有成功。以下是详细信息......

我参与开发一个从各种数据文件中提取数据的网站,将它们组合在一个临时.csv文件中,然后使用流行的图形库绘制图形:dygraphs。该网站的大部分内容都是用PHP编写的。确定绘制数据的参数存储在用户会话中,.csv以用户会话命名并可供下载,然后.csv文件写入脚本,将其传递给dygraphs对象。我们发现,即使发送了无缓存标头:

header("Cache-Control: no-cache, must-revalidate");  
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

许多用户在会话中遇到(如果生成了足够多的不同图表)页面显示页面的旧的静态呈现(他们在会话中先前绘制的数据),就像它被缓存和加载一样得到一个新的请求。它只会变得更奇怪:

我已经在Firefox和Chrome中使用了开发人员工具进行了检查,两个浏览器都接收到了无缓存标头。即使在查看页面源时出现问题,源也是正确的内容(表/图例也是使用php动态创建的,源显示正确的表,但呈现的是旧内容);页面开始正确呈现,直到图表即将显示,然后显示较旧的内容;较旧的内容显示为完全静态的叠加层 - 缓存的图形没有相同的动态功能(滚动数据点显示,缩放和平移等)并且就好像正确的页面位于其下方的某处(csv文件的下载按钮会根据表的大小而移动。如果单击下载.csv按钮,较旧的静态页面不会执行任何操作,但如果您可以设置在其下方的页面中找到该页面,则可以单击并且仍然下载.csv。.csv中的数据是正确的)

这是迄今为止我在开发中看到的最奇怪的事情之一。其他一些相关事实是我在使用Chrome时遇到的所有问题都发生了。 Firefox用户报告了这些症状。 IE用户遇到了同样的问题(IE用户被迫使用chrome框架)。

此时我的智慧已经结束了。我们发送了php标头;我们已经尝试在IIS上为php设置缓存配置文件为“DisableCache”(或其他);我们已经尝试将随机查询字符串发送到结果页面;我们已经尝试了所有适当的元标记 - 都没有成功。

2 个答案:

答案 0 :(得分:0)

您是否尝试过“Last-Modified”和“ETag”? 并且只关注该图表的HTTP标题。

答案 1 :(得分:0)

只要您的服务器忽略URL参数,您就可以通过获取“url.csv?(随机数)”而不是“url.csv”来绕过任何浏览器缓存。