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

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

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

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


They are slightly different - the ETag does not have any information that the client can use to determine whether or not to make a request for that file again in the future. If ETag is all it has, it will always have to make a request. However, when the server reads the ETag from the client request, the server can then determine whether to send the file (HTTP 200) or tell the client to just use their local copy (HTTP 304). An ETag is basically just a checksum for a file that semantically changes when the content of the file changes.

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

所以你真正想做的是使用两个报头-设置Expires报头为一个合理的值,基于内容更改的频率。然后配置要发送的ETags,以便当客户端确实向服务器发送请求时,服务器可以更容易地确定是否将文件发送回。

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


Etag和Last-modified头是验证器。

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

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

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

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


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

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

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

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


另一个总结:

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

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


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

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

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


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


ETag用于确定一个资源是否应该使用复制资源。而Expires Header,比如cache - control,会告诉客户端,在缓存到期之前,客户端应该获取本地资源。

在现代网站中,经常会提供一个名为散列的文件,比如app.98a3cf23.js,所以使用Expires Header是一个很好的做法。除此之外,它还降低了网络成本。

希望能有所帮助;)


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

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

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