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

Posted

技术标签:

【中文标题】使用哪一个:Expire Header、Last Modified Header 或 ETags【英文标题】:Which one to use : Expire Header, Last Modified Header or ETags 【发布时间】:2011-07-16 08:46:15 【问题描述】:

我在 Apache 上运行 php,对如何实现服务器端缓存以使网站加载更快感到困惑。

ExpiresLast-ModifiedETag 标头有什么区别,在什么情况下应该使用哪一个?

【问题讨论】:

【参考方案1】:

ExpiresCache-Control 是“强缓存标头”

Last-ModifiedETag 是“弱缓存标头”

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

如果它必须发出请求,它将在 HTTP 请求中发送Last-Modified/ETag。如果文档的 Etag 值匹配,服务器将发送 304 代码而不是 200,并且没有内容。浏览器将从其缓存中加载内容。

我建议使用强缓存标头之一,以及弱缓存标头之一。

另见:

Google Web Fundamentals: HTTP-Caching MDN web docs: HTTP caching

【讨论】:

您是否发现任何文档支持“强弱”缓存行为?我找不到,我的客户端浏览器现在实际上优先于 last-modified 而不是 expires,我不明白为什么。 弱验证器和强验证器在RFC 2616 13.3.3 节中描述 RFC 2616 说“实体标签通常是“强验证器”,但该协议提供了一种将实体标签标记为“弱”的机制。 我相信 RFC2616 / ETags 的强弱区别是不同的。我相信这个答案的发布者意味着 Expires 和 Cache-Control 是“强”的,因为它们导致浏览器根本没有请求,而 Last-Modified 和 ETag 在感觉浏览器仍然需要发出请求(但服务器可能不需要重新传输整个资源)。【参考方案2】:

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

ETagLast-Modified 邮票之间的区别更具语义。 ETags 对客户端是不透明的。它通常是一个校验和。而 Last-Modified 标头可以由客户端解释。据了解,最后修改的时间戳是线性工作的。

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

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

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

另见:

ETag vs Header Expires http://www.mnot.net/blog/2007/08/07/etags

【讨论】:

所以基本上我们应该使用 mod_expire 而不是 eTags? 那么我们应该什么时候使用最后修改的标题? 如果页面频繁更改,我不明白为什么时间戳对 ETags 有利。对于这两种技术,服务器都会进行简单的比较并发送相同的响应。 @TorstenBronger - 我认为在服务器端使用时间戳更快。 If-None-Match 请求需要读取整个文件,消化它,然后进行比较。 If-Modified-Since 请求需要统计文件,然后与 mtime 进行比较。与阅读和消化相比,统计文件所需的时间要少得多,尤其是对于大文件。 RFC 2616 声明:“实体标签通常是“强验证器”,但该协议提供了一种将实体标签标记为“弱”的机制。”和“ETag ...这可能允许更多在不方便存储修改日期、HTTP 日期值的一秒分辨率不足或源服务器希望避免使用修改日期可能引起的某些悖论的情况下进行可靠验证。”和“HTTP/1.1 源服务器的首选行为是发送强实体标签和 Last-Modified 值。”

以上是关于使用哪一个:Expire Header、Last Modified Header 或 ETags的主要内容,如果未能解决你的问题,请参考以下文章

Indy Header Last-Modified - 日期编码的参数无效

ngx.shared.DICT.expire 详解

如何在 Wordpress 中插入 Last-Modified HTTP-header?

解析通过 last Received: from header 发送 IP 的电子邮件

HTTP分为URI,HEADER,Body三个部分

PHP 会话未设置