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

时间:2012-01-19 20:57:07

标签: php http-headers

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

要从服务器获取新内容,用户必须单击“重新加载”。

我尝试了普通的meta标签,并从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">

2 个答案:

答案 0 :(得分:2)

尝试设置这些标题

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");

这告诉浏览器不要缓存页面,所以它应该在它们回击时重新加载。

答案 1 :(得分:0)

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

无论您使用某些浏览器的标头,似乎总是可以缓存!

我只是想出了我自己想要的解决方案。一直在盯着我。

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

该解决方案非常简单,几乎不需要什么专业知识即可实施。

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

您的浏览器将http://example.com/index.phphttp://example.com/index.php?x=32http://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变量不同,浏览器认为它是不同的页面。

不用担心,我们永远不必阅读它,仅是“愚弄”浏览器。下一个Timne,我们将在同一页面上看到一个非常不同的数字

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

或者就您的浏览器而言,即使在我们完全将变量丢弃回服务器的情况下,也不是在同一页面上,这意味着它在您的ASP或PHP中没有任何价值,并且从未用作变量。

答案非常简单,我感到惊讶,我花了数周的时间对此进行了尝试,但始终无法正常工作。这样!