如何为我的CSS / JS设置缓存标题,但确保访问者始终拥有最新版本?

时间:2013-03-25 21:26:54

标签: caching browser pagespeed

我希望通过确保浏览器缓存所有CSS / JS来加速我网站的加载时间,正如Google的PageSpeed工具所推荐的那样。但是我想确保访问者拥有最新的CSS / JS文件,如果它们被更新并且缓存现在包含旧代码。

从我的研究到目前为止,在CSS / JS url的末尾附加类似“?459454”的内容很受欢迎。但这不会强迫访问者的浏览器每次都重新下载CSS / JS文件吗?

有没有办法设置浏览器缓存的文件,但确保浏览器知道缓存文件的更新版本?

4 个答案:

答案 0 :(得分:3)

如果您正在使用Apache,则可以使用mod_pagespeed(由symcbean前面提到)自动执行此操作。

如果您还使用ModPagespeedLoadFromFile指令,那么它最有效,因为一旦检测到资源在磁盘上发生了变化,它就会创建一个新的URL,但是如果没有它,它将正常工作(它将使用返回的缓存到期时间)当它获取资源以重写它时。)

如果您使用的是nginx,则可以使用ngx_pagespeed。

如果您使用的是IIS,则可以使用IISpeed,它不是Google产品,我不知道它是完整的功能集。

答案 1 :(得分:2)

版本号可以使用,但您也可以使用Web框架或资产构建脚本将文件的哈希附加到文件名:

<script src="script-5054a101c8b164cbfa570d97fe23cc0d.js"></script>

这样,一旦您的HTML发生变化以反映这个新版本,浏览器就会下载并缓存您脚本的更新版本。

答案 2 :(得分:1)

如您所说,将查询字符串附加到资产的URL,但仅在内容不同时更改它,或在部署新版本时更改它。

答案 3 :(得分:0)

  

在CSS / JS url的末尾附加类似“?459454”的内容很受欢迎。但这不会强迫访问者的浏览器每次都重新下载CSS / JS文件吗?

不,它不会强制每次下载,但是有很多中间代理忽略可缓存内容的查询字符串 - 因此许多工具(包括基于的自动URL重写的mod_pagespeed文件内容,以及动态合并的内容以及许多其他很酷的技巧)将版本信息移动到路径/文件名中。

如果您只有.htaccess类型访问权限,那么您可以删除版本信息以直接映射到文件,或者使用脚本化的404重定向器(但如果您支持缓存,这可能只是个好主意反向代理)。