如何阻止浏览器缓存动态内容


how to stop browser from caching dynamic content

我有php生成的页面,这些页面每隔几分钟就会根据底层数据进行更改。在用户点击链接之前,一切都是好的。当用户单击浏览器上的后退按钮返回时,将显示以前加载的页面版本。浏览器没有从服务器重新加载页面。

为了从服务器获取新内容,用户必须单击"重新加载"。

我尝试了普通的元标记,并从php输出header()。

IE、FF和Chrome中的行为相同。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
  Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="pragma" content="no-cache">

尝试设置这些标头

header("Cache-control: no-store, no-cache, must-revalidate");
header("Expires: Mon, 26 Jun 1997 05:00:00 GMT");
header("Pragma: no-cache");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

这告诉浏览器不要缓存页面,因此当他们反击时应该重新加载。

没有一个解决方案适用于所有浏览器。

无论你使用什么标题,有些浏览器似乎总是缓存!

我刚刚想出了一个我自己正在寻找的解决方案。它一直盯着我的脸。

这不会阻止浏览器缓存数据,只会阻止在重新加载页面后从缓存中重新读取过时的数据。如果数据是敏感的,并且从不希望将其写入缓存,那么您仍然可以使用这些标头,但这在所有情况下都不起作用。在我的应用程序中,这是不必要的,我只想避免从浏览器缓存加载过时的数据。

这个解决方案非常简单,实现起来几乎不需要专业知识。

我使用php,但我相信URL变量可以与asp、javascript和更多一起使用

您的浏览器看到http://example.com/index.php,http://example.com/index.php?x=32和http://example.com/index.php?x=3199所有URL都是不同的URL,因此它不会将上述URL中的任何一个用作另一个的缓存。

我用PHP生成了一个随机数,你可能可以在ASP 中这样做

在php中我使用:

$rand=(rand(1, 99999));

现在我在PHP中的链接(即使使用有限的PHP也应该很容易理解)

'<a href="http://example.com/index.php?rand='.$rand.'>"

如果页面已经有URL变量,那么我们将其添加到任何GET表单或串联链接中。

如果表单是张贴表单,我们会将其标记在"操作"URL上,因此

http://example.com/index.php 

成为

http://example.com/index.php?rand=<?php echo $rand;?>

然后,任何我不想缓存的页面,我只需添加这个随机数作为URL变量。这个URL变量根本不由服务器处理,我从来没有得到过那个数字,也不需要

http://example.com/index.php?rand=4398下次我们加载同一个页面时,由于rand=URL变量不同,浏览器认为它是不同的页面。

不用担心,我们永远不必阅读它,它只是为了"愚弄"浏览器。下一次我们进入同一页面时,我们很可能会看到一个非常不同的数字

http://example.com/index.php?rand=55468

或者就你的浏览器而言,不是同一个页面,即使我们在服务器上完全丢弃了变量,这意味着它在你的ASP或PHP中没有价值,也从未用作变量。

答案现在很简单,我很惊讶,我花了几个星期的时间在这件事上,但没有什么能一直奏效。确实如此!