8

因此,我们每周发布我们的项目,我们遇到了客户拥有某些文件的旧版本的问题。

该堆栈是带有骨干样板的 requirejs 和带有 PHP 后端的 Apache2 服务器的骨干。

我们有加载的 index html 文件、使用 AJAX 加载的模板 HTML 文件,然后是所有的 js 文件。

这个问题似乎与https://stackoverflow.com/questions/12103341/backbone-boilerplate-disable-caching有关,但我在那里没有看到一个好的答案。

我听说缓存控制标头和 mod expires 以及 PHP 的 mod 标头可能会有所帮助,但我不知道如何将它们放在一起。

本质上,我们要做的是确保在向产品服务器发布新代码时,所有内容都至少没有缓存一次。然后在那之后,提高加载速度的正常缓存将是理想的。

至少,我想了解如何完全防止这些东西被缓存。

有任何想法吗?

4

5 回答 5

6

就缓存而言,我发现很难控制用户客户端的浏览器。我过去使用的一个技巧是在我的 JS 文件 URL 中附加一个随机数。像

<script src="https://www.mydomain.com/myjsfile.js?123456789"></script>

或者

<script src="https://www.mydomain.com/myjsfile.js?releaseID=123456789"></script>

这会导致客户端将其完全视为一个新文件。您可以为每个版本分配一个随机数,这应该会导致用户的浏览器再次提取新的 JS 文件。同样适用于 CSS。

我希望这有帮助。祝你好运。

于 2012-10-19T19:48:54.993 回答
5

客户端的文件缓存由两个值定义:<head>被调用的 html 文件的 - 部分中的元信息和 HTTP-Header。

在 HTML 文件中,您可以给出两个元标记 cache-control,并expires通过给出一个简单的 php 命令来定义每周到期日期:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="PRIVATE">
<?php
    $daysDelta = 7-date("w");
    $expiration = date(DATE_RFC1123, mktime(0, 0, 0, date("m"), 
        date("d")+$daysDelta+1, date("Y")));
?>
<META HTTP-EQUIV="EXPIRES" CONTENT="<?= $expiration ?>">

这将在星期一早上杀死缓存。另一种方法是通过HTTP-Header进行缓存设置:

<?php
    header("Cache-Control: private");
    header("Expires: <?= $expiration ?>");
?>

使用这两种方法,您将在一周内进行缓存,但在周末之后,客户端将使其缓存无效并重新提取数据。

于 2012-10-25T12:54:36.507 回答
5

要从页面中删除缓存,您需要在页面顶部包含以下内容:-

$this->output->set_header("Expires: Tue, 01 Jan 2000 00:00:00 GMT"); 
$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false); 
$this->output->set_header("Pragma: no-cache");
于 2012-10-26T06:01:58.210 回答
5

使用requirejs,有一个名为urlargs的参数,它为您的所有 requirejs 请求添加一个参数,并可用于强制缓存更新。页面上的示例使用时间戳,但您可能正在寻找构建版本。

但是,您应该使用 r.js 来构建脚本的生产版本(它编译并缩小所有使用 require 加载的文件并生成单个库)。这将减少加载时间并为您省去很多烦恼。你会让他们只链接这个库,并在文件名本身中包含构建版本(类似于骨干网.app.1.0.23456.js)。

于 2012-10-26T14:54:45.660 回答
0

将随机数附加到 uri 会破坏客户端缓存。
相反,追加文件的最后修改时间。

<script src="myjsfile.<?=filemtime('myjsfile.js')?>.js"></script>

处理需要和 .htaccess 规则,例如

RewriteRule ([^/]*)\.[0-9]*\.css$ $1.css [L,NC]

此外,为 .htaccess 提供长期缓存指令

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
</IfModule>
于 2012-10-30T11:45:31.993 回答