Home  >  Q&A  >  body text

javascript - 为什么有了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做什么???

大家讲道理大家讲道理2654 days ago323

reply all(2)I'll reply

  • 大家讲道理

    大家讲道理2017-04-10 16:41:34

    题主摘录的:

    并在给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 ), 那么毫无疑问返回最后修改时间将是消耗最小的.

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

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 16:41:34

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

    reply
    0
  • Cancelreply