Varnish 中的 ESI 内容是否可以被禁止/失效?

Can ESI content be banned / invalidated in varnish?

我有一个内容页面使用 esi:include 标签来包含一个模块,所以假设

/content.html

包含

<esi:include src="/_esi/module.html">

两个 url 都在他们的回复中发送了 cache-conttrol headers。对于 /content.html 这是

Cache-Control: public, max-age=86400

/_esi/module.html 是

Cache-Control:public, max-age=3600

当我加载 /content.html 时,我可以看到我正在从 varnish 获取缓存响应,并且 module.html 标记被适当包含,但是,当我更改 module.html 并禁止时它喜欢:ban req.url == /_esi/module.html 或者即使我扩大禁令范围:ban req.url ~ _esi 我浏览器中的页面仍然没有改变。

我似乎无法在 varnish 文档中找到很多相关信息。我可以明确地使包含的内容(即来自 ESI url 的片段)无效,还是必须等待它过期?

我也尝试实施和使用 PURGE 来实现这一点,但我似乎仍然无法从该包含中获得新鲜内容。

Varnish ESI 将在交付时将页面的最终版本拼接在一起。

如果对象丢失,它会将它所拥有的发送给客户端,然后等待提取完成,然后再继续。如果新获取的对象也是一个 ESI 对象并且有一个包含,这将导致另一个获取等等。包括首先处理深度。

任何包含在 ESI 中的对象都作为缓存中的常规对象存在,并且可以像任何其他对象一样purged/banned/invalidated。

就您所看到的情况而言,我的猜测是您的浏览器缓存有干扰。尝试使用 curl、httpie 或 lwp-request 在命令行上重现它。