【问题标题】:prevent caching in browser防止在浏览器中缓存
【发布时间】:2014-07-21 11:31:44
【问题描述】:

我正在编写一个脚本来修改它自己的内容,我很难阻止它缓存自身并且不显示更新的页面......

我已经尝试了所有我能想到的... 我在 PHP 代码中添加了这些标头:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
header('Expires: 0'); // Proxies.

我在 HTML 代码中添加了这些元标记:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

我什至在其中添加了一个 .htaccess 文件:

Options -Indexes
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>

...然而浏览器一直在缓存它...我还能做些什么吗?

谢谢

【问题讨论】:

  • 您能显示包含脚本的位置的 sn-p 吗?它是如何自我改造的?
  • 在一天结束的时候,浏览器可能会做它想做的任何事情——不管你告诉它做什么。

标签: php .htaccess caching


【解决方案1】:

使用 .htaccess 很好,如果您可以访问 httpd.conf 就更好了。无论哪种方式,这是正确的。但是,您也可以按脚本操作浏览器缓存,如下所示:

<?php
 header("Last-Modified: " . <whatever date you want refreshing>));
 header("Expires: " . <whatever date you want refreshing>));
 header("Cache-Control: max-age=<whatever date ..>);
?>
<!doctype html>
<html lang="en">
<head>
...

【讨论】:

  • 正如我在原始帖子中提到的那样,这是我正在做的事情的一部分
【解决方案2】:

您对文件进行更改后是否清除了缓存?我知道我之前曾为此苦苦挣扎,这是由于一个简单的因素,我在进行更改后没有清除我的缓存。不管怎样,你把我想要的一切都放在首位。

【讨论】:

  • 我正试图对我的脚本进行编程,这样我就不必每次都清空缓存,这样它就可以在没有人工干预的情况下工作......
【解决方案3】:

大多数网络浏览器会缓存基于Last-Modified 的内容。有几个技巧可以告诉浏览器更新可能被缓存的文件:

使用touch 可以更新文件的时间戳:

<?php

$time = time() + 60; // Time Now + One Minute
$file = '/path/to/your/file/';
touch($file, $time);

    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) 
           && 
      (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime($file))) {
      // Send Result To Client
      header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT', 
      true, 304);
      exit;
    }
?>

这将在页面加载时 +1 分钟更新文件上的时间戳 - 然后将其与客户端可能在本地缓存的版本进行比较。如果您不想更新文件时间戳,也可以单独使用 $time 变量而不是 filemtime($file)

【讨论】:

  • 这是一个我不知道的有趣的解决方案,但是由于有几个例程可以编写多个文件,我正在寻找一个可以应用的更通用且包罗万象的解决方案......我想知道如果有...
  • 获得全方位解决方案的唯一方法是清除客户端的缓存。您可以随时将需要更新的文件名添加到数组中,然后将 touch 添加时间戳,以便它们同时更新。
  • 由于此方法依赖于将标头('Last-Modifie:...')发送到客户端,这与发送我已经发送的所有标头有何不同/更好,这些标头具有过期日期,因此据称应该强制重新加载?
  • 主要区别在于更新文件时间戳,将其与HTTP_IF_MODIFIED_SINCE 进行比较——如果相等则返回304 status(未修改)。您在标题中拥有的内容应该足以迫使网络浏览器重新验证并获取页面的新版本。唯一的问题是页面中的其他元素仍然可以保持缓存;更改文件时间戳或使用动态名称意味着文件从可能位于缓存中的原始文件更改。您需要确保不缓存什么类型的文件,它们是.js,还是...?
  • 我创建了一个 CMS 脚本,它可以修改脚本本身的 CSS 文件以及网站的侧边栏和其他内容...例如,当我更改侧边栏时,我看不到更改,直到我重新加载页面(即使是在创建文件后刚刚加载的页面)......我修改的 CSS 文件也会发生同样的情况
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2011-04-28
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多