为频繁更新的网站适当的标准HTTP标头


proper standard http header for website that updates frequently

根据Yahoo YSLOW文档和internet,它指出我需要在服务的web文档必须在未来至少49小时过期的地方使用它,以便它在速度测试中获得好成绩。我在网站上缓存文档和图像以获得最佳性能。问题是当内容更新时,一些浏览器正确地重新加载图像,而其他浏览器使用旧的陈旧内容。一个直接的解决办法是强制使用刷新按钮,但我想尽量避免让用户使用它。

这是我的头设置到目前为止。我用PHP写的。如果你不懂PHP,忽略"header(" and ",true"即可。

header("ETag: '"".md5(time())."'"",true);
header('Last-Modified: '.gmdate('D, d M Y H:i:s',time() - 3600).' GMT',true);
header('Expires: '.gmdate('D, d M Y H:i:s',time()+(3600*24*7)).' GMT',true);
header('Cache-control: max-age:'.(3600*24*7).', public',true);
header("Age: 0",true);
header("Connection: close",true);

基本上我把文档设置为一周后过期,我想更改它。

不管怎样…我所要求的是一种方法来创建一个适当的标题集,用户不必因为他们的浏览器(我假设firefox)而强制重新加载页面,我也想满足谷歌的页面速度见解和雅虎的YSLOW标准。

任何想法?

编辑:我忘了补充一下,这个网站每周更新两到五次,其中大部分更新发生在周末。

设置长过期时间的缓存控制头的目的是使浏览器使用旧的响应更长时间,而不是频繁地与服务器进行检查。如果你想让浏览器频繁地检查新内容,你不能指定一个较长的缓存生存期;这两者截然相反。

但是,您可以做的是为不经常更改且不需要立即被浏览器看到的内容(例如脚本和样式表)指定较长的缓存生存期,同时为频繁更新的内容保持较短的缓存生存期。例如,您可以让浏览器定期检查更新的图像,但每周只检查一次新的脚本和样式表。

另外,即使是像图片这样经常变化的内容——尤其是像图片这样的大文件——也需要支持条件请求,这样浏览器就可以避免重新下载那些实际上没有变化的资源内容。方法是:

  • 在HTTP响应中提供适当的ETagLast-Modified标头,代表资源的当前状态。
  • 基于这些响应头,浏览器可以在以后对同一资源的请求中包含If-None-MatchIf-Modified-Since头。
  • 服务器可以检查这些请求头,如果它们匹配资源的当前状态,则发送304 Not Modified响应;这告诉浏览器它的缓存副本仍然有效。如果报头不匹配-意味着资源已经改变-然后发送新版本的资源以及新的ETagLast-Modified报头。

你目前发送ETagLast-Modified头在你的响应,但他们是无用的,因为他们是基于当前的系统时间,不断变化。从缓存管理的角度来看,文件似乎每秒都"更改"一次(当time()的返回值发生更改时)。您的Last-Modified头应该是文件的修改时间戳,而您的ETag应该是类似于其内容的散列。