Cache-Control
cache-control
用于设置缓存. 我们在服务器端设置如下:
response.setHeader('Cache-Control', 'max-age=30')
服务器返回带有cache-control
的响应. 当浏览器再次请求同一URL
资源时, 若没有超过30
秒, 则会加载缓存中的资源. 若超过30
秒则会向服务器重新请求.
不能为全部资源设置缓存, 否则当服务器端更新资源时, 客户端用的还是缓存. 通常将首页不设置缓存, 其他资源设置缓存.
不为首页设置cache-control
时, 当服务器更新资源时, 资源对应的URL
也会改变. 此时客户端发送请求, 其请求资源的URL
也会改变. 即客户端不会从缓存中获取资源, 而是从服务器端获取资源.
Expires
expires
和cache-coontrol
的用处一样, 它也是为缓存设置有效时间. 与cache-control
不同的是, expires
是老的API
, cache-control
是新的API
. 且cache-control
的优先级比expires
的优先级高.
expires
可以用来删除cookie
. cookie
有下面的特性:
- 若设置的
cookie
已存在, 则会覆盖之前设置的cookie
. - 若设置的
cookie
不存在, 则会添加到现有cookie
中
没有删除已存在cookie
的直接方法. 间接方法是设置相同的cookie
, 并且将cookie
的失效时间设置为以前
删除cookie
只需设置一个已经过期的时间即可:
response.setHeader('Expires', 'Wed, 21 Oct 1900 07:28:00 GMT')
ETag和If-None-Match
在介绍ETag
之前先介绍一下MD5
算法. MD5
算法是一个摘要算法, 它会为一个文件生成一个数字签名, 这个数字签名是独一无二的.
我们将资源的md5
值放在ETag
属性中, 这样当我们请求服务器的资源时, 可以比较上次请求的md5
值和本次请求的md5
值. 注意请求的资源的URL
必须是一致的.
- 若相等则说明资源未更新, 返回部分响应, 包含
304
状态码, 客户端从缓存中获取资源. - 反之说明资源更新了, 服务器返回完整的响应, 即客户端从服务器端获取资源.
ETag
在服务器端设置:
let file = md5(string)
response.setHeader('ETag', file)
if (file === request.headers['if-none-match']) {
response.statusCode = 304//匹配
} else {
response.write(string)//不匹配
}
当客户端第一次请求资源时, 服务器设置ETag
值并返回响应. 若客户端发送第二次请求, 会在请求体中包括If-None-Match
字段, 该字段值为上次响应中的ETag
值. 服务器接收第二次请求并判断服务器当前资源的ETag
值与请求体中的If-None-Match
值是否一致. 若一致则返回304
状态码, 客户端从缓存中获取资源, 若不一致则返回新的资源.