【问题标题】:Forcing cache update in browser在浏览器中强制缓存更新
【发布时间】:2014-04-09 09:52:01
【问题描述】:

我正在使用 Minify (https://code.google.com/p/minify/) 来压缩和合并 ~30 个 css 文件和 ~10 个 javascript 文件。我为这些文件创建了一个组配置,它基本上是一个包含文件名的数组。

就像一个魅力,除了其中一个脚本被修改:浏览器缓存没有及时更新。我曾经获取每个文件的最后修改时间戳(使用 filemtime)来否决浏览器缓存:

$time = '?' . filemtime( $filename );
$output = '<link type="text/css" rel="stylesheet" href="'.$file_path.'?'.$time.'" />';

我可以遍历所有 40 个文件以获得最新的时间戳,但这是一个非常丑陋的解决方案。另一种方式是例如让 crobjob 检查它并将时间戳写入文件,然后我可以将其包含在内。

在我再次发明轮子之前还有其他方法吗?

【问题讨论】:

  • 您可以通过使用 php 处理程序和重定向静态文件请求 vi 重写规则来使用 php 标头的 Cache-Control 和 Expires 属性。请参阅我的答案以获取更多详细信息

标签: php browser-cache minify


【解决方案1】:

你能不能只添加:

src="path/to/file.css?v=<?php date(dmy); ?>"

【讨论】:

  • 我什至可以添加 ?v= ;) 但希望尽可能多地使用缓存。
  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • 我无法发表评论,因为 PHP 标记一直在编辑 @nKn
【解决方案2】:

只获取$file_path...的修改时间?就个人而言,我的文件数量要合理得多(两个或三个),每个文件都单独缓存有其mtime。效果很好。

【讨论】:

  • 这是一个模块化系统,每个模块都有自己的css文件;因此有 40 个文件。
  • 我的系统也是模块化的,网站的每个页面都有一个核心文件和一个文件;)
  • 我以前也有过;现在文件合并了,用户在第一次访问时获得了他们需要的所有 css 和 js(这是登录页面,所以他们不会注意到后台加载了文件)。加快所有其他页面加载:)
【解决方案3】:

我可以建议您定义重写规则并实现静态文件加载处理程序的方法。假设它是assethandler.php,以及你的重写规则;

RewriteRule ^nocache/(.*?)$ assethandler.php?f=$1 [QSA,L]

在 php 中,您可以使用 Cache-Control and Expires 获取始终最新的文件;

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 01 Jul 1990 05:00:00 GMT"); // past date
readfile('path_to_static_files/' . $_GET['f']);

你的静态文件请求会是这样的;

<script src="nocache/your.js"/>

简单地说,当您向nocache/filename 发出请求时,这将被处理为assethandler.php?f=filename,并且在此处理程序中,缓存始终禁用,文件内容作为最新内容提供

【讨论】:

  • 我不是在寻找完全禁用缓存的方法。
  • 只有当你使用路径nocache/...时才会禁用缓存
猜你喜欢
  • 2011-10-11
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
相关资源
最近更新 更多