【问题标题】:Embedding version number VS efficient caching using HTTP headers嵌入版本号 VS 使用 HTTP 标头的高效缓存
【发布时间】:2015-01-27 07:51:33
【问题描述】:

我发现我们可以使用 http 标头,例如:

Cache-Control: no-cache, max-age=86400
Etag: "asdfasdfasdfa"

确保资源被缓存并且如果服务器上的文件未更改,则不会再次从服务器获取资源。 如果文件未更改,服务器将发送 304 响应,如果文件更改,则发送 200 作为响应。

这服务于整个目的,那么为什么建议在其文件名中嵌入文件的指纹或版本号 - 例如style.x234dff.css 确保如果服务器上的资源有一些变化,则提供最新文件

【问题讨论】:

标签: caching http-headers httpresponse server http-caching


【解决方案1】:

它提供了一个很好的模式来实现最大效率,同时在需要时检索最新文件。例如,让我们举一个例子。

所以对于样式表/style.3da37df.css,中间缓存和浏览器会收到类似

的响应
200 OK
Content-Length: 1024
Cache-Control: max-age=31536000
Etag: x234dff

因此,缓存/浏览器将响应解释为从现在起他们可以使用本地副本一年的相同 URL。所以对于同一个 URL,他们甚至不需要请求查看 etag 是否发生了变化。

例如,在上面的交换中,服务器返回一个 1024 字节 响应,指示客户端将其缓存长达 1 年,并且 提供了一个验证令牌(“x234dff”),可以在之后使用 响应已过期检查资源是否已被修改。

所以当响应过期时使用etag。因此,在接下来的一年中,他们可以安全地使用本地副本而无需任何检查。但是,可能需要强制中间缓存和浏览器强制再次获取样式。这可以通过在文件名中添加指纹来完成,因为无论何时更改 URL(因为名称更改),都会再次获取资源。因为主页说 Cachec-control: no-cache 即不缓存主页,所以浏览器总是会检测到 HTML 源中的这些 URL 更改。

那么,我们如何才能两全其美:客户端缓存和 快速更新?很简单,我们可以改变资源的URL并强制 用户在其内容更改时下载新响应。 通常,这是通过嵌入文件的指纹或 版本号,在其文件名中 - 例如style.x234dff.css.

ETag、Cache-Control 和唯一 URL 的组合使我们能够 提供世界上最好的:长寿命的到期时间,控制 可以缓存响应并按需更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2016-09-30
    • 2012-02-20
    • 2012-08-26
    相关资源
    最近更新 更多