0

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

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

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

4

2 回答 2

4

YSlow 通常不建议删除 ETag,但对于某些环境。当不使用 ETags 时,你应该使用它Last-Modified

ETag并且Last-Modified用于重新请求已缓存且可能已过期的资源时的条件 GET-Requests

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

所以在你的情况下:

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

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

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

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

于 2012-06-29T17:52:29.083 回答
0

ETag并且Cache-Control标头不是排他性的。您链接到的页面建议删除 ETags 的原因是减少 HTTP 标头的大小。这最多可以为您节省几个字节。这是一个用例,在哪里以及为什么同时拥有两者仍然有意义:

  • 您提供application.js一周的有效期和一个 etag 指纹
  • 一周过去了,用户回到你的站点:文件已经过期,浏览器发送一个条件请求,如果文件没有被修改,浏览器可以决定完全跳过请求文件。(Last-Modified 也有效)

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

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

于 2012-06-29T17:45:56.630 回答