缓存设置不只是决定“存多久”,还关系到用户能否及时看到更新,以及文件会不会留在不该留的设备上。图片、脚本与下载文件的缓存规则区别,主要在于更新方式和内容敏感度:带版本号的静态资源适合长缓存,可能随时替换的文件应缩短缓存或要求重新验证,私人文件则要优先控制存储范围。
先看内容如何更新,再决定缓存多久
常见响应头 Cache-Control 用来控制浏览器及共享缓存的行为。max-age 表示响应可直接使用的秒数;no-cache 并非禁止保存,而是使用前需要向服务器验证;no-store 则要求不要存储响应。设置时还要区分公开资源与用户专属内容,不能只按文件扩展名判断。
三类文件的设置重点
图片:稳定文件可长缓存,替换频繁的要留更新通道
网站标志、已定稿的商品图等,如果文件名会随内容变化,可以使用较长缓存,例如一年左右,并配合 immutable 表明文件发布后不应原地修改。文件名带内容哈希或版本号时,这种方式尤其适合:图片更新后换新文件名,旧文件仍可供已有页面使用。
若图片始终使用同一个文件名并可能被替换,例如活动横幅,可把缓存缩短到数分钟至一天左右,具体取决于更新频率和用户对旧图的容忍度;也可通过 ETag 让浏览器在缓存过期后询问服务器内容是否变化。用户上传的私密图片不应因“是图片”就设为公开长缓存。
脚本:优先版本化,避免页面与代码错配
JavaScript 文件会影响页面功能。构建时生成带哈希的文件名后,可设置较长的公开缓存;每次代码变化产生新文件名,浏览器便会请求新版本。若脚本使用固定名称,则应缩短缓存时间,或设置为每次使用前重新验证。发布时还要确认 HTML 已指向新脚本,并在旧文件仍可能被页面引用的期间保留它,避免新旧版本切换造成加载失败。
下载文件:区分公开资料与个人文件
公开的说明书、软件安装包等,若文件名包含版本且内容发布后不变,可采用长缓存;经常更新的 PDF 或表格,应缩短缓存或使用验证机制。订单凭证、个人报告等与用户身份相关的下载内容,通常应设为 private,并根据敏感程度考虑 no-store,避免共享缓存留存。Content-Disposition 的 attachment 用于提示浏览器按附件处理,它本身不等于缓存规则。
按类型设置的可执行步骤
列出资源用途:标记文件是否公开、是否含个人信息,以及内容会不会在原路径更新。
为可版本化的图片、脚本和公开下载文件采用新文件名发布;确认引用它们的页面也能及时更新。
给稳定且公开的版本化文件设置较长 max-age;给固定名称、更新频繁的文件设置较短时间或要求重新验证。
为个人下载检查响应头,避免误设 public 或长时间共享缓存;敏感内容按风险选择 private 或 no-store。
在浏览器开发者工具的网络面板检查响应头,并分别测试首次访问、再次访问和文件更新后的行为。还应留意页面本身是否缓存过久,否则页面可能继续引用旧文件名。
常见问题
图片、脚本与下载文件的缓存规则区别,能否统一设置?
不建议。统一长缓存可能让固定路径的更新延迟生效,统一不缓存则会增加重复请求;至少应按公开性、更新频率和是否版本化分组。
设置 no-cache 会让文件每次都重新下载吗?
不一定。浏览器通常会先验证资源是否变化;若服务器确认未变化,可以继续使用本地副本,具体取决于响应头及客户端行为。
长缓存后发现文件内容有误怎么办?
若文件名可变,发布修正版并更新引用通常更稳妥。若文件名固定,客户端可能仍使用旧副本,能否立即更新取决于缓存期限及中间缓存的处理。
下载文件的附件标记能代替缓存控制吗?
不能。附件标记控制浏览器如何处理文件,缓存是否保存、保存多久仍需通过缓存相关响应头明确设置。
归纳来说,图片、脚本与下载文件的缓存规则区别不在文件后缀本身,而在版本管理、更新节奏和数据敏感性。先判断这些条件,再配置缓存时间与验证方式,才能兼顾加载效率和内容正确性。