【问题标题】:Why does google pagespeed asks to specify ETag even when cache headers are set为什么即使设置了缓存标头,谷歌 pagespeed 也会要求指定 ETag
【发布时间】:2012-06-30 20:55:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: pagespeed yslow


    【解决方案1】:

    YSlow 通常不建议删除 ETag,但对于某些环境。不使用 ETag 时,您应该使用 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 的框架,它利用这些和其他概念,而不会对您的网站开发产生负面影响。

    【讨论】:

    • 很好的答案,但这里更重要的是。在每个请求的响应标头中添加几个字节以避免 1 年后下载完整的内容?大多数用户可能每年至少清除一次缓存。即使该网站没有使用一年前使用的相同资源的可能性也更大。
    • 每个客户端视图:嗯,对于将被缓存的资源,您只有 一个 响应的这些额外字节。当浏览器的缓存过期或者它想更早地刷新它的缓存时,可以通过条件请求来完成。这取决于资源,但很可能来自 one 响应和 one 条件请求的附加标头字段小于缓存的资源。然后您通过设置 ETag 或 Last-Modified 获胜。我同意对于小于这两个标头字段的 VEEERY 小资源丢弃这些是有意义的。
    • 如果站点很有可能在 Cache-Control max-age 时间内更改了资源,那么它的配置不正确。 Cache-Control max-age 表示缓存资源的有效期肯定
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 链接站点上提到的不使用ETag 的主要原因是它在Apache 和IIS 服务器上的默认配置以及在多服务器环境中的默认配置问题。因此,您必须在此处自行正确配置ETag 或完全删除它。较小的标头大小更多是一种副作用,但不应成为删除 ETags 的原因。
    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多