我想在浏览器中缓存一个对象(图像(。但在交付之前,应检查清漆缓存中的物体是否仍然是最新的。 我需要在清漆 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 输出配置它,我建议采用输出的SHA或MD5哈希。
清漆呢?
Varnish 在两个方向上都支持Etag
和Last-Modified
,这意味着:
- 如果浏览器发送包含
If-None-Match
标头的请求,Varnish 可以返回一个HTTP 304
如果值与存储的ETag
匹配并且缓存的对象仍然是最新的。 - 如果 Varnish 需要重新验证过期的对象,它将使用浏览器发送的相同
If-None-Match
值。
Cache-Control
TTL呢?
请务必了解,条件请求仅在TTL过期时发生。如果要频繁重新验证,请将Cache-Control
TTL 值设置得相当低。
只要您的后端平台(Web 服务器或应用程序(经过优化,可以在不使用太多服务器资源的情况下处理这些条件请求,您就可以了。
Varnish 将向后端异步执行此条件请求,并在执行此请求时向浏览器提供过时数据。