ETag vs Header Expires

时间:2009-02-01 01:12:03

标签: http apache-config etag mod-expires

我环顾四周但未能弄清楚我是否应该同时使用ETag 过期标题

我要做的是确保我的Flash文件(以及其他图片以及当这些文件发生更改时不仅会更新。

我不想做任何特别的事情,例如更改文件名或在网址末尾添加一些奇怪的字符以使其不被缓存。

另外,在我的PHP脚本中,我需要以编程方式执行任何操作以支持此操作,还是所有Apache?

8 个答案:

答案 0 :(得分:662)

它们略有不同 - ETag没有任何客户可以用来确定是否在将来再次请求该文件的信息。如果ETag是它的全部,它将始终必须提出请求。但是,当服务器从客户端请求中读取ETag时,服务器可以确定是发送文件(HTTP 200)还是告诉客户端仅使用其本地副本(HTTP 304)。 ETag基本上只是文件的校验和,当文件内容发生变化时,文件会在语义上发生变化。

客户端(和代理/缓存)使用Expires头来确定它是否甚至需要向服务器发出请求。您越接近Expires日期,客户端(或代理)就越有可能从服务器发出该文件的HTTP请求。

所以你真正要做的就是使用BOTH标头 - 根据内容变化的频率将Expires标头设置为合理的值。然后配置要发送的ETag,以便当客户端向服务器发送请求时,可以更轻松地确定是否将文件发回。

关于ETag的最后一点注意事项 - 如果您使用运行Apache的多台计算机的负载平衡服务器设置,您可能希望关闭ETag生成。这是因为inode被用作ETag哈希算法的一部分,这些算法在服务器之间是不同的。您可以将Apache配置为不使用inode作为计算的一部分,但是您需要确保文件上的时间戳完全相同,以确保为所有服务器生成相同的ETag。

答案 1 :(得分:104)

Etag 上次修改的标头是验证器

它们帮助浏览器和/或缓存(反向代理)了解文件/页面是否已更改,即使它保留了相同的名称。

过期缓存控制正在提供刷新信息

这意味着他们可以通知浏览器和代理之间的反向代码,直到他们将页面/文件保留在缓存中的时间或时间长度。

因此,问题通常是使用哪个验证器,etag或最后修改,以及使用哪个刷新信息标头,过期或缓存控制。

答案 2 :(得分:30)

ExpiresCache-Control是“强大的缓存标题”

Last-ModifiedETag是“弱缓存标题”

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

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

答案 3 :(得分:19)

默认情况下,Apache会生成一个Etag based on文件的inode编号,最后修改日期和大小,这应该是完全可以做到你想要的。我认为默认情况下它还会根据磁盘上文件的最后修改时间生成一个Last-Modified标头,这样做完全没问题。

你可能也应该让Apache发送一个日期为一年的Expires标题(根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21),以便浏览器知道内容是可缓存的。请查看mod_expires以配置它。

答案 4 :(得分:13)

另一个总结:

你需要同时使用两者。 ETag是“服务器端”信息。过期是“客户端”缓存。

  • 使用 ETags ,除非您有负载平衡的服务器。它们是安全的,并且会让客户知道每次更改内容时都应该获得新版本的服务器文件。

  • Expires 必须谨慎使用,就像您将来设置过期日期但想立即更改其中一个文件(例如JS文件),某些用户可能直到很长时间才得到修改后的版本!

答案 5 :(得分:1)

我想提及的另一件事是,一些答案可能已经错过了在标题中同时包含ETagsExpires/Cache-control的缺点。

根据您的需要,它可能只会在您的标头中添加额外的字节,这可能会增加数据包,这意味着更多的TCP开销。同样,您应该看看是否需要在标题中包含这两项内容的开销,或者只是在请求中增加额外的权重,这会降低性能。

您可以在Kyle Simpson撰写的这篇优秀博客文章中了解更多相关信息:http://calendar.perfplanet.com/2010/bloated-request-response-headers/

答案 6 :(得分:1)

在我看来,使用Expire Header,服务器可以告诉客户端我的数据何时失效,而使用Etag,服务器会检查客户端每个请求的etag值。

答案 7 :(得分:0)

ETag用于确定资源是否应使用副本一。并且像Cache-Control这样的Expires Header告诉客户端,在缓存几十年之前,客户端应该获取本地资源。

在现代网站中,通常会提供一个名为hash的文件,例如app.98a3cf23.js,因此使用Expires Header是一个好习惯。除此之外,它还降低了网络成本。

希望它会有所帮助;)