我环顾四周,但还没有能够弄清楚,如果我应该同时使用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。

其他回答

另一个总结:

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

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

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

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

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

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

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

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

希望能有所帮助;)

Etag和Last-modified头是验证器。

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

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

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

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

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。