一个页面上的资源,可以简单分为两种: url 可变,比如这个页面上的 css 文件,这次可能是 app.fe5a24f8ae.css,下次可能是 app.613e5f58f1.css 比如第一种,我们可以这样设置响应头: Cache-Control max-age=31536000, must-revalidate 表示这个资源一年内都有效,过期的话才要到服务器上验证。 那么,我们如何保证资源修改后能及时更新到用户端?修改 url 即可。 而针对第二种,因为 url 无法改变,我们就需要另外的方式。 比如: Cache-Control no-cache no-cache 不是表示不能缓存,而是说每次浏览器都要跟服务器做个确认 – 通过 ETag 或 Last-Modified,这样就会多出一个请求 。 对于 HTML 文档谨慎设定过期时间 大部分情况下,对于其他图片、CSS、JavaScript 等资源的请求都来自一个单一的 HTML 文档。对于这类页面通常应该设定比较短的过期时间,或者干脆不设定。因为如果这类页面被缓存,那么页面中包含的资源的文件名等等信息都会一并被缓存,导致对它的更新难以确保立即对用户生效。 引用静态资源时,不要使用 Query String Query String 就是例如?key=val的字符串,如 <script src="/static/js/func.js?v=a87ff8"></script> 设定缓存的方法 对于 Apache 服务器,可以通过 mod_expires 模块来设定ExpiresHTTP 头或Cache-ControlHTTP 头的max-age指令。编辑相应目录下的 .htaccess 文件,或直接对 Apache 的配置文件(根据服务器系统版本不同,可能为httpd.conf或apache2.conf等)作出修改。 分文件类别设定 使用ExpiresByType可以按照文件的 MIME Type 设定某一类文件的过期日期。例如: <IfModule mod_expires.c> years ExpiresByType text/html "access plus 1 month 15 days 2 hours" 如果希望根据扩展名来指定缓存规则,可以使用FilesMatch配合正则表达式。为了简洁,我这里只规定了ExpiresDefault。它的优先级很低,只会在对应文件没有任何其他规则能够匹配(包括上层目录下的缓存规则)时生效。 <IfModule mod_expires.c> 同理,也可以对某些文件启用特定的缓存策略。注意,文件名中的点(.)是需要转义的。 <IfModule mod_expires.c> 对某一文件夹下的所有文件设定 对于静态文件,一个比较方便的做法是将它们全部放到一个目录下,并对该目录下的所有文件设定。但是,此处需要注意防止其他规则将ExpiresDefault覆盖掉。 <IfModule mod_expires.c> |