适用于经常更新的网站的标准http标头

时间:2014-06-17 00:42:40

标签: php html browser-cache pagespeed yslow

根据雅虎YSLOW文档和互联网,它表明我需要在未来至少49小时内提供服务,因为它在速度测试中具有良好的评分。我在网站上缓存文档和图像以获得最佳性能。问题是当内容更新时,某些浏览器会正确地重新加载图像,而其他浏览器则使用旧的陈旧内容。立即修复是强制使用刷新按钮,但我想尽量避免让用户使用它。

到目前为止,这是我的标题设置。我用PHP编写。如果您不理解PHP,只需忽略“header(”和“,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),我也想要满足google pagespeed的见解和雅虎的YSLOW标准。

有什么想法吗?

编辑:我忘了补充一点,网站每周更新两到五次,大部分更新都在周末进行。

1 个答案:

答案 0 :(得分:0)

设置具有较长过期时间的缓存控制标头的目的是使浏览器使用旧响应的时间更长,而不是频繁地检查服务器。如果您希望浏览器经常检查新内容,则无法指定长缓存生存期;两者截然相反。

但是,您可以执行的操作是为不经常更改的内容指定较长的缓存生命周期,并且不需要立即通过浏览器(如脚本和样式表)查看,同时保留缓存经常更新内容的终身短缺。您可以让浏览器定期检查更新的图像,但是每周只检查一次新的脚本和样式表。

此外,即使对于频繁更改的内容(如图片) - 尤其是图片等大型文件 - 您也希望支持条件请求,因此浏览器可以避免重新下载资源内容。 ;实际上已经改变了。这样做的方法是:

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

您目前正在回复中发送ETagLast-Modified标题,但它们无用,因为它们基于当前系统时间而不断变化。从缓存管理的角度来看,该文件似乎已经改变了#34;每秒(当time()的返回值发生变化时)。您的Last-Modified标头应该是文件的修改时间戳,而您的ETag应该类似于其内容的哈希值。