ETag vs报头过期

我环顾四周,但还没有弄清楚我是否应该同时使用ETag 而且和Expires Header 一个或另一个。

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

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

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

139342 次浏览

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

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

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

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

Etaglast - modified头文件是验证器

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

到期cache - control给出刷新信息

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

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

ExpiresCache-Control是“强缓存头文件”

Last-ModifiedETag是“弱缓存头”

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

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

另一个总结:

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

  • 使用ETags,除非你有一个负载均衡的服务器。它们是安全的,并且会让客户端知道,每当您在您的端更改某些内容时,他们应该获得服务器文件的新版本。

  • 过期必须谨慎使用,因为如果你设置了一个过期日期在遥远的未来,但想要立即更改其中一个文件(例如JS文件),一些用户可能要很长时间才能得到修改后的版本!

我想提到的另一件事是,一些答案可能漏掉了,即在头文件中同时使用ETagsExpires/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"使用Header

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