当前位置:  开发笔记 > 编程语言 > 正文

ETag vs Header Expires

如何解决《ETagvsHeaderExpires》经验,为你挑选了5个好方法。

我环顾四周,但一直没能找出如果我应该使用了ETag 一个Expires头一个或另一个.

我要做的是确保我的Flash文件(以及其他图像以及当这些文件发生更改时不仅会更新.

我不想做任何特别的事情,例如更改文件名或在URL的末尾添加一些奇怪的字符以使其不被缓存.

另外,在我的PHP脚本中,我需要以编程方式执行任何操作以支持此操作,还是所有Apache?



1> Marc Novakow..:

它们略有不同 - ETag没有任何客户可以用来确定是否在将来再次请求该文件的信息.如果ETag是它的全部,它将始终必须提出请求.但是,当服务器从客户端请求中读取ETag时,服务器可以确定是发送文件(HTTP 200)还是告诉客户端仅使用其本地副本(HTTP 304).ETag基本上只是文件的校验和,当文件内容发生变化时,该文件会在语义上发生变化.

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

所以你真正想做的就是使用BOTH标头 - 根据内容变化的频率将Expires标头设置为合理的值.然后配置要发送的ETag,以便当客户端向服务器发送请求时,它可以更容易地确定是否将文件发回.

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


您还应该检查是否应该使用Cache-Control而不是Expires.我的理解是,在Expires之后引入了Cache-Control,并为您提供更多控制.请参阅http://stackoverflow.com/questions/5799906/whats-the-difference-between-expires-and-cache-control-headers
让我们说我们将使用两者.过期时间到期后会发生什么,但文件未更改(Etag相同)?服务器将返回304,文件将从浏览器缓存中提供.我的问题是,此刻将会重现过期时间吗?
使用Expires标头时,最好在资源发生变化时更改文件名,因为客户端在过期之前不会再次请求文件.特别是如果您使用远期未来值作为到期日期.
小心将ETAG*和*Expires标头设置为非零值.这可能导致竞争条件.请参阅https://jakearchibald.com/2016/caching-best-practices/
是否可以告诉服务器根本不使用inode或时间戳?另外,为什么它们需要ETag,如果它只用于表示内容?

2> 小智..:

EtagLast-modified标头是验证器.

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

ExpiresCache-control正在提供刷新信息.

这意味着他们可以通知浏览器和代理之间的反向代码,他们可以将页面/文件保留在其缓存中的时间或持续时间.

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



3> hienbt88..:

Expires并且Cache-Control是"强大的缓存标题"

Last-Modified并且ETag是"弱缓存标题"

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

如果必须发出请求,它将发送Last-Modified/ETagHTTP请求.如果Etag文档的值与之匹配,则服务器将发送304代码而不是200,而不是内容.浏览器将从其缓存中加载内容.



4> David Z..:

默认情况下,Apache将根据文件的inode编号,最后修改日期和大小生成一个Etag ,这应该可以完美地完成您想要的操作.我认为默认情况下它还会根据磁盘上文件的最后修改时间生成一个Last-Modified标头,这也很适合做你想做的事情.

您可能也应该让Apache发送一个未来一年的Expires标题(根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21),以便浏览器知道内容是缓存.看看mod_expires来配置它.


一年到期的标题是否会告诉客户甚至不检查一年的新版本?
@John Bachir:看起来很糟糕,但浏览器似乎无论如何都要打服务器,至少要查询更新的版本.我打开了另一个关于这个问题的问题:http://stackoverflow.com/questions/10048740/mod-expires-how-to-stop-browser-hitting-server-for-images-that-should-stay-cac

5> Benjamin Pie..:

另一个总结:

你需要同时使用它们.ETag是"服务器端"信息.过期是"客户端"缓存.

除非您有负载平衡的服务器,否则请使用ETag.它们是安全的,并且会让客户知道每次更改某些内容时,他们都应该获得新版本的服务器文件.

必须谨慎使用Expires,就好像您将来设置过期日期但想要立即更改其中一个文件(例如JS文件),某些用户可能要到很长时间才能获得修改后的版本!


如果出现此Expires情况,您基本上需要重命名您的js并在HTML中更改它,并希望您没有设置HTML文件的过期1年.
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有