该用哪个:过期标头、最后修改标头还是ETags

47

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

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

2个回答

66

ExpiresCache-Control 是“强缓存头”。

Last-ModifiedETag 是“弱缓存头”。

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

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

我建议使用一种强缓存头和一种弱缓存头。

另请参阅:


你有找到任何支持“强缓存”和“协商缓存”的文档吗?我没有找到,而且我的客户端浏览器现在实际上优先考虑“最后修改时间”而不是“过期时间”,这让我感到困惑。 - Sam YC
强验证器和弱验证器在RFC 2616第13.3.3节中有描述。 - user2418306
4
RFC 2616指出,“实体标签通常是“强验证器”,但协议提供了一种将实体标签标记为“弱验证器”的机制。” - cquezel
3
我认为RFC2616 / ETags的强弱区别是不同的。我相信这个回答的发布者的意思是Expires和Cache-Control在某种意义上是“强壮的”,因为它们会导致浏览器根本不发出请求,而Last-Modified和ETag在某种意义上是较弱的,因为浏览器仍然需要发出请求(但服务器可能无需重新传输整个资源)。 - Matthijs Kooijman

34
您可以使用 Expires 标头与其他两个标头结合使用,但不管其他两个标头是否存在,它都是代理和浏览器缓存普遍支持的。 ETagLast-Modified 时间戳之间的区别更多地是语义上的。 ETags 对客户端来说是不透明的,通常是校验和。 而 Last-Modified 标头可以被客户端解释。 它理解最后修改的时间戳线性工作。
如果浏览器请求带有 If-Unmodified-Since 的资源,则过去的广泛时间戳可能会匹配此条件。 如果您的页面经常更改,则 Last-Modified 时间戳可能是有利的。
另一方面,ETag 方法导致客户端保存每个资源一个最后的指纹。 (我不确定浏览器缓存是否记住多个 ETags)。 在请求中,仅列出一个或几个可能的 If-None-Match 令牌。 这可能意味着更多的未命中。 另外,您必须比较多个校验和,而使用 Last-Modified 时间戳,您可以进行算术比较。
ETags 的真正优势在于您可以可靠地比较指纹。 Last-Modified 时间戳有点模糊,因为它们不验证实际页面内容是否更改。
另请参阅:

如果您的文件经常被修改,对于主要是静态内容的情况,建议使用ETags(或同时使用)。 - mario
我现在正在做的是给静态文件分配过期标头并关闭eTag,这样可以吗/足够吗? - Avinash
2
如果页面经常更改,我不明白为什么时间戳对ETags有什么优势。对于这两种技术,服务器进行简单比较并发送相同的响应。 - Torsten Bronger
2
@TorstenBronger - 我认为在服务器端使用时间戳更快。 If-None-Match 请求需要读取整个文件,摘要它,然后进行比较。If-Modified-Since 请求需要对文件进行状态检查,然后与修改时间进行比较。对文件进行状态检查所需的时间比读取和摘要文件所需的时间少得多,特别是对于大文件而言。 - Mjonir74
3
RFC2616规定:“实体标签通常是“强验证器”,但协议提供了一种将实体标签标记为“弱验证器”的机制。”还有"ETag...这可能允许在存储修改日期不方便、HTTP日期值的一秒分辨率不足以及源服务器希望避免某些悖论的情况下进行更可靠的验证。"以及“对于一个HTTP/1.1起源服务器,首选行为是同时发送强实体标签和Last-Modified值。” - cquezel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接