我已经将缓存标头设置为遥远的未来(从现在起 1 年),并按照 YSlow (http://developer.yahoo.com/performance/rules.html#etags) 的建议禁用了 ETag,但即使在设置缓存标头后,Google pagespeed 似乎也需要 ETag(或上次修改)。
"为所有可缓存资源指定一个过期或缓存控制最大年龄,以及上次修改或 ETag,这一点很重要。"
这两个规则似乎相互冲突。
YSlow 不建议一般删除 ETag,但对于某些环境。不使用ETags时,您应该改用Last-Modified
。
ETag
和 Last-Modified
适用于重新请求已缓存且可能已过期的资源时的条件 GET 请求。
Cache-Control max-age
用于定义缓存项的有效期,而无需再次询问。(当此规则过期时,浏览器将进行有条件的 GET ...
所以在你的情况下:
- 浏览器正在缓存资源一年。在这一年中,根本没有提出任何关于这一资源的请求。它直接从本地缓存提供。(使用
Cache-Control
标头设置。 - 浏览器在一年到期后执行条件请求,以检查是否有更改。当没有任何更改时,服务器以
HTTP 304
和空体进行响应。在这种情况下,浏览器将继续使用其缓存项,而无需重新传输。(使用ETag
和/或Last-Modified
标头设置)
(浏览器可能会也可能不会尊重您的数据。例如,即使一年尚未过期,浏览器也可能执行条件请求。
对于高度优化的网站,Cache-Control
更为重要,因为您可以将其设置为faaaar未来的过期标头,并且只需更改资源的URL,以防它发生变化。虽然这可以防止使用条件请求,但它使您能够在定义 expires 标头时非常激进,同时能够立即向每个人提供新版本的资源。这是因为新的 URL,它似乎是浏览器视图中的新资源。
对于Java,存在一个名为jawr的框架,它利用了这些和其他概念,而不会对您的网站开发产生负面影响。
ETag
和 Cache-Control
标头不是独占的。您链接到的页面建议删除 ETag 的原因是为了减小 HTTP 标头的大小。这最多只能为您节省几个字节。这是一个用例,其中和为什么同时拥有两者仍然有意义:
- 您向
application.js
提供一周的到期日期和 etag 指纹 - 一周过去了,用户回到您的网站:文件已过期,浏览器发出条件请求,如果文件尚未修改,浏览器可以决定完全跳过请求文件。(最后修改作品)
如果您不提供ETag
或Last-Modified
,浏览器必须请求并下载整个文件。
良好的相关资源:https://developers.google.com/speed/articles/caching