在 PHP 中,我试图借鉴 Rails 的做法(参见“使用资产时间戳” 这里):
默认情况下,Rails 将资产的时间戳附加到所有资产路径中。这使您可以为资产设置远期缓存过期日期,但仍然能够通过简单更新文件(因此更新时间戳,然后更新 URL,因为时间戳是其中一部分,从而破坏缓存)即可立即使其失效。
您需要使用的 Web 服务器负责设置缓存资产的远期到期日期,以利用此功能。以下是 Apache 的示例:
# Asset Expiration
ExpiresActive On
<FilesMatch "\.(ico|gif|jpe?g|png|js|css)$">
ExpiresDefault "access plus 1 year"
</FilesMatch>
如果您查看Rails页面的源代码,您将会看到它们是什么意思:样式表的路径可能是
"/stylesheets/scaffold.css?1268228124"
,其中末尾的数字是文件上次更新的时间戳。所以它应该像这样工作:
- 浏览器说“给我这个页面”
- 服务器说“好的,并且顺便说一下,叫做
scaffold.css?1268228124
的这个样式表可以缓存一年-它不会改变。” - 在重新加载时,浏览器说“我不再请求那个CSS文件,因为我的本地副本仍然有效。”
- 一个月后,您编辑并保存文件,这会更改时间戳,这意味着文件不再叫做
scaffold.css?1268228124
,因为数字已经改变。 - 当浏览器看到这个时,它说“我从未见过那个文件!请给我一份拷贝。”缓存被“破坏”了。
现在:如何判断缓存和缓存破解是否有效?我正在使用两个Firebug插件检查我的页面:Yslow和Google Page Speed。两者似乎都表明我的文件已被缓存:“在Yslow中添加过期标头”和“在Page Speed中利用浏览器缓存”都已被勾选。但是,当我查看Page Speed活动时,我看到了很多请求和等待,没有“缓存命中”。如果我更改我的样式表并重新加载,我会立即看到更改。但我不知道这是因为浏览器从未缓存还是因为缓存已被破坏。我怎么知道呢?更新:它起作用了!如果有人感兴趣,我刚刚写了一篇博客文章解释细节。