动态缩小CSS:利用浏览器缓存

时间:2012-12-07 19:52:51

标签: php css caching browser-cache

我正在编写一个脚本,它将合并并缩小请求的CSS文件,然后将它们回显出去。我完成了大部分工作,但是我仍然坚持一个小而重要的部分:利用浏览器缓存。

我们网站的大多数访客都是新手,很少再回来。所以我们真正担心的是在同一会话中的页面请求之间进行缓存。就像,他们点击我们的主页,然后导航到其他几页并离开。

我遇到的问题是我在会话中为每个特定文件集的最后一个请求时间存储一个时间戳。因此,如果我想要main.css和internet.css这个请求,然后是main.css和phone.css下一页视图,那么最后一个请求的时间戳将被更新,但如果我再次请求同一组文件,时间戳将会与上次保持不变。

希望我有意义。问题是,当文件从上一次请求更改为此文件时,我返回304未修改。但是,浏览器并没有像它应该那样缓存css。关于为什么不这样做的任何想法?

你可以在这里查看我的代码:https://gist.github.com/4235836(我通常把它放在这里,但它有点长)

1 个答案:

答案 0 :(得分:1)

我认为您应该在发送304之前检查请求标头If-modified-since:

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && 
    strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $minifier->lastModified)
{
    header('HTTP/1.0 304 Not Modified');
    exit;
}

还要注意退出。如果您发送304,则表示客户端已经拥有最新版本,因此您应该在那里退出脚本。

修改

使用过期标头时,浏览器会认为它已经有最新版本。因此,与使用HTTP_IF_MODIFIED_SINCE标头不同,它甚至不会向服务器发出请求。

所以你可能还想添加:

header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60 * 24)));

然后为了确保在文件发生变化后它会请求新版本,你可以像以下那样做声音:

<link rel="stylesheet" type="text/css" 
    href="minify.php?v=<?php echo filemtime($theFileToMinify) ?>">