Varnish是否有可能在vcl_fetch中检查请求的内容(而不仅仅是标题)并做出反应?

时间:2015-02-09 18:03:21

标签: varnish varnish-vcl

我知道默认的Varnish vcl_fetch会查看beresp.ttlberesp.http.*来引用从后端返回的HTTP标头,但是还可以检查响应的内容吗?我们的后端有时会因垃圾HTML而失败,但状态为200 OK。我们希望能够对结果运行正则表达式,并在可能的情况下重试。

我知道Varnish< = 3.0的版本无论如何都不会流式传输并在传递给客户端之前下载整个对象,但我在文档中找不到beresp中的相应字段 - 我我在找beresp.http.content

之类的东西

1 个答案:

答案 0 :(得分:2)

是和否。它是可访问的,但只能通过内联C,而不是VCL配置(据我所知)。但是,由于解析正文文本需要额外的开销,因此不容易做到并且不是真正推荐的。也就是说,您可以看到尝试类似于您在此处寻找的内容:rewrite vmod for varnish 3

如果您的垃圾HTML响应具有特定长度,则可以根据响应的Content-Length标头重试请求。或者,您可以考虑添加客户端JS来评估HTML并向URL发出AJAX请求以清除任何垃圾页面的缓存。最后,如果您知道只有您网站的某个特定子集返回无效结果,您可以尝试通过OpenResty与LuaJIT或启用了subs模块的nginx来代理这些URL,并在那里进行正文解析。