我知道默认的 Varnish vcl_fetch
会查看 beresp.ttl
和 beresp.http.*
来引用从后端,但是是否也可以检查响应的内容?我们的后端有时会因 HTML 垃圾而失败,但状态为 200 OK。我们希望能够对结果运行正则表达式,并在可能的情况下重试。
我知道 Varnish <= 3.0 的版本无论如何都不会进行流式传输,并且在传递给客户端之前不会下载整个对象,但我在文档中的 beresp
中找不到相应的字段 -我正在寻找类似 beresp.http.content
最佳答案
是和否。它是可以访问的,但只能通过内联 C,而不是 VCL 配置(据我所知)。然而,由于解析正文文本的额外开销,这并不容易做到,并且并不真正推荐。也就是说,您可以在此处看到类似您正在寻找的内容的尝试: rewrite vmod for varnish 3
如果您的垃圾 HTML 响应具有特定长度,您可以根据响应的 Content-Length header 重试该请求。或者,您可以考虑添加客户端 JS 来评估 HTML 并向 URL 发出 AJAX 请求以清除任何垃圾页面的缓存。最后,如果您知道只有网站的特定子集返回无效结果,您可以尝试通过 OpenResty 等 LuaJIT 或启用了 subs 模块的 nginx 来代理这些 URL,并在那里进行正文解析。
关于varnish - Varnish 是否可以在 vcl_fetch 中检查请求的内容(而不仅仅是 header )并使用react?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28416314/