http协商缓存中:
Etag/lastModified过程如下:
1.客户端请求一个页面(A)。
2.服务器返回页面A,并在给A加上一个Last-Modified/ETag。
3.客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
4.客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
5.服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。
那既然一定会验证etag是否匹配,还需要last-modified做什么???
题主摘录的:
这里是
or
的关系,非and
测试:
Apache对于静态内容默认会返回Last-modified和ETag.
Nginx只会返回Last-modified(可配置etag on开启).
测试结果:
两者的功能均正常...
所以楼主提的问题是正确的, 有了etag即使没有last-modified也还是可以与服务器交换资源是否已经改动的.
问题在于:
何时应该使用etag?
何时应该使用last-modified?
如获取最后修改时间代价太高 (如不经常变动的动态内容), 使用etag, 然后用哈希或crc算法返回校验值.
如很容易最后修改时间 (如图片/js/css ), 那么毫无疑问返回最后修改时间将是消耗最小的.
两个都返回也是可以的.