我环顾四周但未能弄清楚我是否应该同时使用ETag 和过期标题或。
我要做的是确保我的Flash文件(以及其他图片以及当这些文件发生更改时不仅会更新。
我不想做任何特别的事情,例如更改文件名或在网址末尾添加一些奇怪的字符以使其不被缓存。
另外,在我的PHP脚本中,我需要以编程方式执行任何操作以支持此操作,还是所有Apache?
答案 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)
Expires
和Cache-Control
是“强大的缓存标题”
Last-Modified
和ETag
是“弱缓存标题”
首先浏览器检查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)
我想提及的另一件事是,一些答案可能已经错过了在标题中同时包含ETags
和Expires/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是一个好习惯。除此之外,它还降低了网络成本。
希望它会有所帮助;)