.htaccess: 缓存控制,如何处理网站更新?

4

我刚在网上搜索了一下,但没有找到一个好的答案:

Google页面速度扩展程序提示我在我的网站(PHP)上缓存文件。因此,我更新了我的.htaccess文件(在我的网站测试区域),以缓存某些类型的文件:

ExpiresActive On
ExpiresDefault A0
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

在测试区编码时,我注意到由于缓存控制设置,例如要获取最新的.css文件,我需要按下F5。这对我来说还好...但是对于用户呢?
所以当我更新我的网站(或文件过期)时,我能否告诉浏览器只重新下载所有文件,并在不需要时使用缓存呢?
如果我可以告诉浏览器:“嘿,在更新时间之前的所有文件都已经旧了,请重新下载它们 - 但是在更新时间之后的文件是可以使用缓存的”,那就太完美了。
2个回答

6
这里是我有时使用的简单方法,不需要任何复杂的配置。每当您修改CSS或JavaScript文件时,在标记中添加一个虚拟参数即可。我通常使用当前日期和/或时间。例如:
<link type="text/css" rel="stylesheet" href="site.css?120911" />
这将强制浏览器在需要更新时下载文件的新副本,同时仍允许您在后台保持一致的文件名。

1
我现在正在添加 ?v=unix_date_string,基于文件的 mtime。我认为这比编辑文件名更好。 - ptmr.io

2
出于性能考虑,您已指示浏览器在很长时间之前将文件缓存,而不是从服务器请求它。
这就是浏览器正在做的事情:使用缓存中的文件,而不向服务器发出任何请求--这是正确的行为。
当您修改文件时,为了强制浏览器重新请求并获取新版本,您唯一的解决方案是更改其URL
通常,这是通过在文件名中整合版本号来完成的。
http://www.yoursite.com/my-file-123.css

当文件更新时:

http://www.yoursite.com/my-file-124.css

由于URL已更改,浏览器没有文件在其缓存中,并从服务器请求新版本。


当然,手动执行此操作非常困难,并且容易出错...

因此,一般而言(假设您有一个构建脚本,该脚本从源代码控制中提取您网站的源代码并将其打包用于生产),您会将此过程集成到您站点的构建脚本中。


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