为什么有了etag还需要last-modified?

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做什么???

阅读 12.4k
3 个回答

题主摘录的:

并在给A加上一个Last-Modified/ETag

这里是 or 的关系,非 and

测试:

  1. Apache对于静态内容默认会返回Last-modified和ETag.

  2. Nginx只会返回Last-modified(可配置etag on开启).

测试结果:

  • 两者的功能均正常...

  • 所以楼主提的问题是正确的, 有了etag即使没有last-modified也还是可以与服务器交换资源是否已经改动的.

问题在于:

  1. 何时应该使用etag?

  2. 何时应该使用last-modified?

  • 如获取最后修改时间代价太高 (如不经常变动的动态内容), 使用etag, 然后用哈希或crc算法返回校验值.

  • 如很容易最后修改时间 (如图片/js/css ), 那么毫无疑问返回最后修改时间将是消耗最小的.

  • 两个都返回也是可以的.

ETag 比较的是响应内容的特征值,而Last-Modified 比较的是响应内容的修改时间。这两个是相辅相成的,并不是说有了ETag就不该有Last-Modified,有Last-Modified就不该有ETag。同时传入服务器时,服务器可以根据自己的缓存机制的需要,选择ETag或者是Last-Modified来做缓存判断的依据,甚至可以两个同时参考。

这两个不是同时出现的,modified是老的http标准就有的,ETag是后来的http标准里才有的,算是对modified的优化,解决了一些modified不能解决的问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏