为什么google pagespeed要求指定ETag,即使设置了缓存标头

时间:2012-06-29 10:07:46

标签: pagespeed yslow

我已将缓存标头设置为将来(1年后),并按照YSlow(http://developer.yahoo.com/performance/rules.html#etags)的建议禁用了ETag,但Google pagespeed似乎甚至需要ETag(或最后修改)设置缓存标头后。

“为所有可缓存资源指定一个Expires或Cache-Control max-age,以及Last-Modified或ETag之一。”

这两条规则似乎相互冲突。

2 个答案:

答案 0 :(得分:4)

YSlow建议不要删除ETag,但是对于某些环境。如果不使用ETag,则应使用Last-Modified代替。

重新请求已缓存且可能已过期的资源时,

ETagLast-Modified用于条件GET请求

Cache-Control max-age用于定义缓存商品的有效期,无需再次询问。 (当此规则到期时,浏览器将进行条件GET ...)

所以在你的情况下:

  • 浏览器将资源缓存一年。在那一年内,根本没有对此资源的请求。它直接由本地缓存提供。 (使用Cache-Control标头设置。)
  • 浏览器在一年过期后执行有条件请求以检查是否有更改。当没有任何改变时,服务器以HTTP 304响应并清空。在这种情况下,浏览器继续使用其缓存项而无需重新传输。 (使用ETag和/或Last-Modified标头设置)

(浏览器可能会也可能不会尊重您的数据。例如,即使一年尚未过期,浏览器也可能会执行条件请求。)

对于高度优化的网站,Cache-Control更重要,因为您将其设置为faaaar future expire标头,只需更改资源的URL即可。虽然这可以防止使用条件请求,但是它可以在定义过期标头时能够极其激进,同时能够同时为每个人提供新版本的资源。这是因为新的URL似乎是浏览器视图中的新资源。

对于Java,存在一个名为jawr的框架,它使用这些和其他概念,而不会对您的网站开发产生负面影响。

答案 1 :(得分:0)

ETagCache-Control标题不是独占的。您链接的页面建议删除ETag的原因是减少HTTP标头的大小..这最多可以节省几个字节。这是一个用例,其中以及为什么仍然有意义:

  • 您为application.js提供了一周的到期日期和etag指纹
  • 周传递,用户回到您的站点:文件已过期,浏览器调度条件请求,如果文件尚未修改,浏览器可以决定跳过完全请求文件。 (Last-Modified也有效)

如果您未提供ETagLast-Modified,则浏览器来请求并下载整个文件。

良好的相关资源:https://developers.google.com/speed/articles/caching

相关问题