使用哪一个:Expire Header,Last Modified Header或ETags

Avi*_*ash 31 php etag apache2 last-modified mod-expires

我在Apache上运行PHP,并对如何实现服务器端缓存感到困惑,以便加快网站加载速度.

是什么之间的区别Expires,Last-Modified以及ETag头,哪一个应该在什么情况下使用?

hie*_*t88 39

Expires并且Cache-Control是"强大的缓存标题"

Last-Modified并且ETag是"弱缓存标题"

首先,浏览器检查Expires/Cache-Control以确定是否向服务器发出请求.

如果必须发出请求,它将发送Last-Modified/ETagHTTP请求.如果Etag文档的值与之匹配,则服务器将发送304代码而不是200,而不是内容.浏览器将从其缓存中加载内容.

我建议使用一个强大的缓存标头,以及一个弱缓存标头.

  • 我相信 RFC2616 / ETags 的强弱区别是不同的。我相信这个答案的发布者意味着 Expires 和 Cache-Control 是“强”的,因为它们会导致浏览器*根本不发出请求*,而 Last-Modified 和 ETag 则较弱,因为浏览器仍然会发出请求需要发出请求(但服务器可能不需要重新传输整个资源)。 (4认同)
  • RFC 2616说"实体标签通常是"强验证器",但该协议提供了一种将实体标签标记为"弱"的机制. (3认同)

mar*_*rio 24

您可以Expires结合使用标题,但不管其他两个.代理和浏览器缓存普遍支持它.

ETagLast-Modified邮票之间的区别更具语义性.ETag对客户来说是不透明的.它通常是校验和.客户端可以解释Last-Modified标头.据了解,上次修改的时间戳是线性的.

如果浏览器请求资源If-Unmodified-Since,那么过去的各种时间戳都可以匹配这样的条件.如果您的页面频繁更改,则Last-Modified时间戳可能更有利.

另一方面,ETag方法导致客户端为每个资源保存最后一个指纹.(我不确定浏览器缓存是否记得多个ETag).根据请求,仅If-None-Match列出一个或几个可能的令牌.这可能意味着更多的失误.此外,您必须比较多个校验和,而使用Last-Modified时间戳,您可以进行算术比较.

ETags的真正优势在于您可以可靠地比较指纹.Last-Modified时间戳更模糊,因为它们不验证实际页面内容是否已更改.

也可以看看:

  • RFC 2616声明:"实体标签通常是"强验证器",但协议提供了一种机制,将实体标签标记为"弱"."和"ETag ......这可能允许在不方便的情况下进行更可靠的验证存储修改日期,其中HTTP日期值的一秒分辨率不足,或者原始服务器希望避免使用修改日期可能产生的某些悖论." 并且"HTTP/1.1源服务器的首选行为是发送强实体标记和Last-Modified值." (3认同)
  • 如果页面频繁更改,我不明白为什么时间戳对ETag有利.对于这两种技术,服务器进行简单的比较并发送相同的响应. (2认同)
  • @TorstenBronger - 我认为在服务器端使用时间戳更快.If-None-Match请求需要读取整个文件,将其消化,然后进行比较.If-Modified-Since请求需要统计文件,然后与mtime进行比较.统计文件所需的时间远远少于读取和摘要,特别是对于大型文件. (2认同)