清漆:如果图像在清漆缓存中仍然是最新的并且未在应用程序中更新,则从浏览器缓存中获取图像



我想在浏览器中缓存一个对象(图像(。但在交付之前,应检查清漆缓存中的物体是否仍然是最新的。 我需要在清漆 vcl 文件中配置什么?

  • 应用程序必须将对象清除到/在清漆中

实现这一目标的最佳方法是利用所谓的条件请求

条件请求的工作原理

条件请求将执行低影响验证,以检查缓存中的对象是否仍被视为最新对象。

目标是仅在验证不匹配时才提供完整对象。如果验证成功,后端服务器将不会返回任何有效负载,并将使用HTTP 304状态代码来指示该值仍然相同。

有两种方法可以做到这一点:

  • Etag响应标头
  • Last-Modified响应标头

埃塔格

Etag是一个HTTP响应标头,它传输响应的指纹,允许浏览器检查他们拥有的版本是否仍然是最新的。

一旦浏览器收到Etag,它将存储其值,并在每次后续请求时通过If-None-Match标头传输该值。

由应用程序将If-None-Match值与即将公开的Etag值进行比较。如果值相同,则浏览器仍具有最新版本,并且不需要获取完整的有效负载。

在这种情况下,由 Web 服务器或应用程序在不发送任何有效负载的情况下返回HTTP 304, NOT MODIFIED标头。

如果 Web 服务器或应用程序针对检测条件请求并返回HTTP 304响应进行了优化,则性能影响可能是巨大的。

上次修改时间

除了在 HTTP 响应中包含Etag标头外,您还可以包含Last-Modified标头,该标头表示上次修改此页面的时间。

浏览器将查找此值,存储它,并在后续请求时通过If-Modified-Since标头传输该值。

故事的其余部分是相同的:Web服务器或应用程序应该注意该标头,并在适当的时候返回HTTP 304

如何配置埃塔格

在 Apache 中,您可以通过配置FileETag设置来确保自动添加Etag。请参阅 https://httpd.apache.org/docs/2.4/mod/core.html#fileetag

Nginx有一个类似的配置设置:http://nginx.org/en/docs/http/ngx_http_core_module.html#etag

如果您想自己为 HTML 或 JSON 输出配置它,我建议采用输出的SHAMD5哈希。

清漆呢?

Varnish 在两个方向上都支持EtagLast-Modified,这意味着:

  • 如果浏览器发送包含If-None-Match标头的请求,Varnish 可以返回一个HTTP 304如果值与存储的ETag匹配并且缓存的对象仍然是最新的。
  • 如果 Varnish 需要重新验证过期的对象,它将使用浏览器发送的相同If-None-Match值。

Cache-ControlTTL呢?

请务必了解,条件请求仅在TTL过期时发生。如果要频繁重新验证,请将Cache-ControlTTL 值设置得相当低。

只要您的后端平台(Web 服务器或应用程序(经过优化,可以在不使用太多服务器资源的情况下处理这些条件请求,您就可以了。

Varnish 将向后端异步执行此条件请求,并在执行此请求时向浏览器提供过时数据

最新更新