我环顾四周,但还没有能够弄清楚,如果我应该同时使用ETag和过期头或一个或另一个。

我试图做的是确保我的flash文件(和其他图像和什么不仅得到更新时,有一个变化的这些文件。

我不想做任何特殊的事情,比如改变文件名或在url末尾放置一些奇怪的字符,以使它不能被缓存。

还有,我需要在我的PHP脚本中做什么编程来支持它,还是全是Apache?


当前回答

我想提的另一件事是,有些答案可能忽略了,在头文件中同时使用ETags和Expires/Cache-control的缺点。

根据你的需要,它可能只是在你的头中增加额外的字节,这可能会增加数据包,这意味着更多的TCP开销。同样,您应该看看在头文件中同时使用这两种内容的开销是必要的,还是只会在请求中增加额外的重量,从而降低性能。

你可以在Kyle Simpson的博客上读到更多信息:http://calendar.perfplanet.com/2010/bloated-request-response-headers/

其他回答

Etag是一个散列,用于指示资源的版本。当服务器返回数据时,它对数据进行散列,并在ETAG下设置这个散列值。当您向服务器发送“PUT”请求以更新记录时,可能同时另一个用户发出了相同的“PUT”请求,并且其请求已被处理。服务器将检查你的“PUT”数据,并将看到它是相同的更新,所以它不会再进行另一次更新,它将发送给你更新的数据(由另一个用户),你将更新你的缓存。

当缓存时间到期时,浏览器自动发出一个新请求以获取新数据。这就是为什么使用“Expires”报头的原因

如果响应中同时包含Expires头和max-age指令, max-age指令覆盖Expires头,即使 过期报头的限制更大。该规则允许使用源服务器 为给定响应提供较长的过期时间 HTTP/1.1(或更高版本)缓存,而不是HTTP/1.0缓存。这可能是 如果某些HTTP/1.0缓存不正确地计算年龄或 过期时间,可能是由于时钟不同步。

Expires和Cache-Control是“强缓存头”

Last-Modified和ETag是“弱缓存头”

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

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

另一个总结:

你需要两者兼用。ETags是一个“服务器端”信息。过期是“客户端”缓存。

使用ETags,除非您有负载均衡的服务器。它们是安全的,并且会让客户端知道,每当您在您的端更改某些内容时,他们应该获得服务器文件的新版本。 过期必须谨慎使用,如果你设置了一个过期日期在遥远的未来,但想要立即更改其中一个文件(例如JS文件),一些用户可能要很长时间才能得到修改后的版本!

在我看来,有了过期头,服务器可以告诉客户端我的数据什么时候会过期,而有了Etag,服务器会检查客户端每个请求的Etag值。

Etag和Last-modified头是验证器。

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

Expires和Cache-control正在提供刷新信息。

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

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