Open varHarrie opened 1 year ago
服务器在HTTP响应头中返回Expires字段,指定一个过期时间(如Thu, 01 Dec 2022 15:46:39 GMT),在下次请求之前对比本地当前时间是否在过期时间之前,如符合,则从内存或硬盘中读取缓存,不去请求服务器资源。
Expires
Thu, 01 Dec 2022 15:46:39 GMT
缺陷:过度依赖本地时间,如果本地时间与服务器时间不同步,则可能导致资源无法缓存或永远缓存的问题。
服务器在HTTP响应头中返回Cache-Control字段,包含以下属性:
Cache-Control
举例:
Cache-control:max-age=60000,s-maxage=120000,public
通常使用Cache-Control代替Expires,因为前者时HTTP 1.1的,如果要考虑兼容性,仍可使用Expires。
服务器在HTTP响应头中返回Last-Modified字段,即当前文件的修改时间,浏览器会在下一次请求时携带If-Modified-Sine字段,值为上次的Last-Modified,服务端判断时间如果时间一致,则返回304状态码,前端直接使用上次缓存的资源。
Last-Modified
If-Modified-Sine
缺陷:如果文件内容没有修改,但修改时间已经更新(如只修改了文件名),这种情况仍会导致缓存失效。或者文件在几百毫秒内完成了再次修改,因为记录的最小单位是秒,依然会被认为没有修改。
服务器在HTTP响应头中返回ETag字段,即当前文件指纹,浏览器在下次请求时携带If-None-Match字段,值为上一次的ETag,服务端判断如果一致,则返回304状态码,前端直接使用上次缓存的资源。
ETag
If-None-Match
缺点:计算文件指纹意味着服务端需要有更多开销;ETag存在强校验、弱校验,强校验情况下生成的哈希码会深入到文件的每个字节,能够最大程度进行精确判断,但同时也意味着更大的性能消耗,弱校验整体速度比较快,但也意味着准确率较低,降低协商缓存的有效性。
1、文件名包含哈希码的静态文件:采用Cache-Control强制缓存。
2、index.html:采用协商缓存,具体看服务器性能、文件修改情况。
n
一、强制缓存
1、Expires(已废弃)
服务器在HTTP响应头中返回
Expires
字段,指定一个过期时间(如Thu, 01 Dec 2022 15:46:39 GMT
),在下次请求之前对比本地当前时间是否在过期时间之前,如符合,则从内存或硬盘中读取缓存,不去请求服务器资源。缺陷:过度依赖本地时间,如果本地时间与服务器时间不同步,则可能导致资源无法缓存或永远缓存的问题。
2、Cache-Control
服务器在HTTP响应头中返回
Cache-Control
字段,包含以下属性:举例:
通常使用
Cache-Control
代替Expires
,因为前者时HTTP 1.1的,如果要考虑兼容性,仍可使用Expires。二、协商缓存
1、Last-Modified / If-Modified-Sine
服务器在HTTP响应头中返回
Last-Modified
字段,即当前文件的修改时间,浏览器会在下一次请求时携带If-Modified-Sine
字段,值为上次的Last-Modified
,服务端判断时间如果时间一致,则返回304状态码,前端直接使用上次缓存的资源。缺陷:如果文件内容没有修改,但修改时间已经更新(如只修改了文件名),这种情况仍会导致缓存失效。或者文件在几百毫秒内完成了再次修改,因为记录的最小单位是秒,依然会被认为没有修改。
2、ETag / If-None-Match
服务器在HTTP响应头中返回
ETag
字段,即当前文件指纹,浏览器在下次请求时携带If-None-Match
字段,值为上一次的ETag
,服务端判断如果一致,则返回304状态码,前端直接使用上次缓存的资源。缺点:计算文件指纹意味着服务端需要有更多开销;ETag存在强校验、弱校验,强校验情况下生成的哈希码会深入到文件的每个字节,能够最大程度进行精确判断,但同时也意味着更大的性能消耗,弱校验整体速度比较快,但也意味着准确率较低,降低协商缓存的有效性。
三、针对不同文件采取不同缓存策略
1、文件名包含哈希码的静态文件:采用Cache-Control强制缓存。
2、index.html:采用协商缓存,具体看服务器性能、文件修改情况。