varHarrie / varharrie.github.io

:blue_book: Personal blog site based on github issues.
https://varharrie.github.io
MIT License
3.66k stars 548 forks source link

HTTP缓存策略 #48

Open varHarrie opened 1 year ago

varHarrie commented 1 year ago

image

一、强制缓存

1、Expires(已废弃)

服务器在HTTP响应头中返回Expires字段,指定一个过期时间(如Thu, 01 Dec 2022 15:46:39 GMT),在下次请求之前对比本地当前时间是否在过期时间之前,如符合,则从内存或硬盘中读取缓存,不去请求服务器资源。

缺陷:过度依赖本地时间,如果本地时间与服务器时间不同步,则可能导致资源无法缓存或永远缓存的问题。

2、Cache-Control

服务器在HTTP响应头中返回Cache-Control字段,包含以下属性:

举例:

Cache-control:max-age=60000,s-maxage=120000,public

通常使用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:采用协商缓存,具体看服务器性能、文件修改情况。

alisherovuz commented 1 month ago

n