ETag与标题过期
我环顾四周,但一直无法弄清楚我是否应该同时使用一个ETag 和一个Expires头或一个或另一个。
我想要做的是确保我的闪存文件(和其他图像,什么不仅更新时,这些文件的变化。
我不想做任何特殊的事情,比如改变文件名,或者在url的末尾添加一些奇怪的字符,以免被caching。
另外,有什么我需要在我的PHP脚本编程方式做我的PHP脚本来支持这一点,还是所有的Apache?
它们略有不同 – ETag没有任何信息,客户可以使用它来确定是否在将来再次请求该文件。 如果ETag已经有了,它总是会提出请求。 但是,当服务器从客户端请求中读取ETag时,服务器可以确定是发送文件(HTTP 200)还是告诉客户端只使用本地副本(HTTP 304)。 一个ETag基本上只是一个文件的校验和,在文件内容发生变化时语义上会发生改变。
客户端(和代理/caching)使用Expires头来确定它是否甚至需要向服务器发出请求。 您到达Expiresdate越近,客户端(或代理)就越可能从服务器向该文件发出HTTP请求。
所以你真正想要做的是使用BOTH头文件 – 根据内容改变的频率将Expires头文件设置为一个合理的值。 然后configurationETags发送,这样当客户端发送一个请求到服务器时,可以更容易地决定是否发回文件。
关于ETag的最后一个注意事项 – 如果您在运行Apache的多台机器上使用负载平衡的服务器设置,则可能需要closuresETag生成。 这是因为inode被用作ETag哈希algorithm的一部分,在服务器之间将是不同的。 您可以将Apacheconfiguration为不使用inode作为计算的一部分,但是您需要确保文件上的时间戳完全相同,以确保为所有服务器生成相同的ETag。
Etag和最后修改的头文件是validation器 。
它们帮助浏览器和/或caching(反向代理)了解文件/页面是否已经改变,即使它保留了相同的名称。
过期和caching控制提供刷新信息 。
这意味着他们通知浏览器和代理服务器之间的反向,直到什么时间或多长时间,他们可以将页面/文件保存在其caching中。
所以问题通常是使用哪一个validation器,etag或最后修改,以及哪个刷新信息头使用,过期或caching控制。
Expires
和Cache-Control
是“强大的caching标题”
Last-Modified
和ETag
是“弱caching头”
首先,浏览器检查Expires/Cache-Control
以确定是否向服务器发出请求
如果不得不提出请求,则会在HTTP请求中发送Last-Modified/ETag
。 如果文档的Etag
值与此匹配,则服务器将发送304代码而不是200,并且没有内容。 浏览器将从其caching中加载内容。
默认情况下,Apache将根据文件的inode编号,上次修改的date和大小生成一个Etag,这应该完全可以做到你想要的。 我认为它也会根据磁盘上文件的最后修改时间默认生成一个Last-Modified标头,这对于做你想做的也是完美的。
你可能也应该让Apache发送一个过期一年的Expires头(根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ),以便浏览器知道内容是caching。 看看mod_expires来configuration它。
另一个总结:
你需要使用两者。 ETags是“服务器端”的信息。 过期是“客户端”caching。
-
除非有负载平衡的服务器,否则请使用ETag 。 他们是安全的,并会让客户知道他们应该得到你的服务器文件的新版本,每次你改变你的一面。
-
必须谨慎使用过期 ,就好像你在将来设置了过期date,但想要立即更改其中一个文件(例如JS文件),有些用户可能会很长一段时间才能获得修改的版本!
在我看来,随着Expire Header,服务器可以告诉客户端我的数据将陈旧,而与Etag,服务器将检查客户端的每个请求的etag值。
还有一件事我想提一下,有些答案可能已经错过了在标题中同时使用ETags
和Expires/Cache-control
的缺点。
根据您的需要,它可能只是在您的头添加额外的字节,这可能会增加数据包,这意味着更多的TCP开销。 再一次,你应该看看是否有必要在你的头文件中的这两个东西的开销,或者它会增加额外的重量在你的请求,从而降低性能。
你可以阅读更多关于这个由凯尔辛普森这个优秀的博客文章: http : //calendar.perfplanet.com/2010/bloated-request-response-headers/