Caching 如何为CSS/JS设置缓存头,同时确保访问者始终拥有最新版本?

Caching 如何为CSS/JS设置缓存头,同时确保访问者始终拥有最新版本?,caching,browser,pagespeed,Caching,Browser,Pagespeed,我想通过确保浏览器缓存所有CSS/JS来加速我的站点的加载时间,正如Google的PageSpeed工具所建议的那样。但是我想确保访问者拥有最新的CSS/JS文件,如果它们被更新并且缓存现在包含旧代码的话 根据我到目前为止的研究,在CSS/JS url的末尾添加?459454之类的东西是很流行的。但这不会迫使访问者的浏览器每次都重新下载CSS/JS文件吗 是否有办法设置浏览器要缓存的文件,但确保浏览器知道缓存文件的更新版本?如您所说,将查询字符串附加到资源的URL,但仅在内容不同时更改,或在部署

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

根据我到目前为止的研究,在CSS/JS url的末尾添加?459454之类的东西是很流行的。但这不会迫使访问者的浏览器每次都重新下载CSS/JS文件吗


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

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

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

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

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

这样,一旦HTML更改以反映此新版本,浏览器将只下载并缓存脚本的更新版本。

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

<script src="script-5054a101c8b164cbfa570d97fe23cc0d.js"></script>
这样,一旦您的HTML更改以反映此新版本,浏览器将只下载并缓存脚本的更新版本

在CSS/JS url的末尾添加?459454之类的内容是很流行的。但这不会迫使访问者的浏览器每次都重新下载CSS/JS文件吗

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

如果您只有.htaccess类型的访问权限,那么您可以将版本信息剥离出来直接映射到文件,或者使用脚本404重定向器,但这可能只是在缓存反向代理之后的一个好主意

在CSS/JS url的末尾添加?459454之类的内容是很流行的。但这不会迫使访问者的浏览器每次都重新下载CSS/JS文件吗

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


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

如果您使用的是Apache,则可以使用symcbean前面提到的mod_pagespeed自动执行此操作

如果您还使用ModPagespeedLoadFromFile指令,则效果最好,因为它会在检测到磁盘上的资源已更改时立即创建一个新的URL,但是如果不这样做,它将正常工作,它将使用获取资源时返回的缓存到期时间来重写它

如果您使用的是nginx,那么就可以使用ngx_pagespeed


如果您使用的是IIS,您可以使用IISpeed,它不是谷歌的产品,我不知道它的全部功能集。

如果您使用的是Apache,您可以使用symcbean前面提到的mod_pagespeed来自动执行此操作

如果您还使用ModPagespeedLoadFromFile指令,则效果最好,因为它会在检测到磁盘上的资源已更改时立即创建一个新的URL,但是如果不这样做,它将正常工作,它将使用获取资源时返回的缓存到期时间来重写它

如果您使用的是nginx,那么就可以使用ngx_pagespeed


如果你使用的是IIS,你可以使用IISpeed,它不是谷歌的产品,我不知道它的全部功能集。

我想这是我的问题。在部署新代码之前,我必须手动更改附加的字符串,并且仅在文件更改时更改附加的字符串。我想我可以用git after build hooks以某种方式实现自动化?在部署时,写出tag/sha并使用它。或者md5文件内容,然后使用它,这是自动的,但不确定性能如何。我想这是我的问题。在部署新代码之前,我必须手动更改附加的字符串,并且仅在文件更改时更改附加的字符串。我想我可以用git after build hooks以某种方式实现自动化?在部署时,写出tag/sha并使用它。或md5
该文件的内容和用途是自动的,但不确定性能如何。这里也回答了这个问题:这里也回答了这个问题: