0

我正在编写一个脚本,它将合并和缩小请求的 CSS 文件,然后将它们回显出来。我已经完成了大部分工作,但是我被困在一件小而非常重要的事情上:利用浏览器缓存。

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

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

希望我说得通。问题是,当一个文件从上次请求到这个请求没有改变时,我返回 304 not modified。但是,浏览器并没有像应有的那样缓存 css。关于为什么不的任何想法?

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

4

1 回答 1

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) ?>">
于 2012-12-07T20:04:11.247 回答