为什么谷歌页面速度要求指定 ETag 即使设置了缓存标头



我已经将缓存标头设置为遥远的未来(从现在起 1 年),并按照 YSlow (http://developer.yahoo.com/performance/rules.html#etags) 的建议禁用了 ETag,但即使在设置缓存标头后,Google pagespeed 似乎也需要 ETag(或上次修改)。

"为所有可缓存资源指定一个过期或缓存控制最大年龄,以及上次修改或 ETag,这一点很重要。"

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

YSlow 不建议一般删除 ETag,但对于某些环境。不使用ETags时,您应该改用Last-Modified

ETagLast-Modified 适用于重新请求已缓存且可能已过期的资源时的条件 GET 请求

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

所以在你的情况下:

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

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

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

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

ETagCache-Control 标头不是独占的。您链接到的页面建议删除 ETag 的原因是为了减小 HTTP 标头的大小。这最多只能为您节省几个字节。这是一个用例,其中和为什么同时拥有两者仍然有意义:

  • 您向application.js提供一周的到期日期和 etag 指纹
  • 一周过去了,用户回到您的网站:文件已过期,浏览器发出条件请求,如果文件尚未修改,浏览器可以决定完全跳过请求文件。(最后修改作品)

如果您不提供ETagLast-Modified,浏览器必须请求并下载整个文件。

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

相关内容

  • 没有找到相关文章

最新更新