如何在CakePHP2中缓存静态内容(css、图片、js文件)?

5

我需要为CSS文件、图像文件、js文件等(Webroot内容)设置一些HTTP头“过期时间”、“缓存控制”、“最后修改时间”。

我已经了解到,通过某些功能可以实现这一点。

   Configure::write('Asset.timestamp', true); // In core.php

还有 Helper 类的 assetTimestamp 方法。

现在的问题是:它如何使用?

我阅读了 HtmlHelper 代码,在 css 方法中,第 361 行有这样一段:

$url = $this->assetTimestamp($this->webroot($path));

对于那些在谷歌上搜索“为以下资源指定至少一周后的过期时间”的烘焙师们 - givanse
1个回答

11

已解决。

首先,你需要考虑通过 Apache 进行处理。你可以参考这篇指南:http://httpd.apache.org/docs/2.2/caching.html

问题在于 CakePHP 有一种方法可以做到这一点。而且非常不错。

我将为 CSS 文件解释这一点。当然,也可以用于 JS 内容。

1)在 core.php 文件中(位于 app/config/ 下),取消注释此行:

Configure::write('Asset.filter.css', 'css.php');

这行代码告诉 CakePHP 将所有对 CSS 文件的请求都通过 "css.php" 脚本路由。正如其名称所示,它是一个过滤器。我们可以在那里做任何想做的事情。

2) 创建 "css.php" 文件。你需要在 app/webroot/ 目录下创建它。

在那里,你可以获取浏览器请求的文件,并应用一些缓存 HTTP 标头。

比如:

$filepath = CSS . $regs[1]; //There are some variables that are can be used in this script, take a look to de docs.

$output = file_get_contents($filepath);
header("Date: " . date("D, j M Y G:i:s ", $templateModified) . 'GMT');
header("Content-Type: text/css");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + DAY) . " GMT"); //WEEK or MONTH are valid as well
header("Cache-Control: max-age=86400, must-revalidate"); // HTTP/1.1
header("Pragma: cache");        // HTTP/1.0
print $output;

就这样!您的内容将使用指定的标头提供,并且浏览器将知道可以缓存它们。

看看:

http://www.bunchacode.com/programming/get-cakephp-build-in-css-compression-to-work/

那里有一个很好的 css.php 版本,还进行了最小化处理。


2
我们可以使用这个来处理js和css。我们如何为图像添加过期头呢? - Andrew L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接