是否可以根据 Varnish 中后端响应的大小来阻止缓存?

Hub*_*bro 6 caching varnish varnish-vcl varnish-4

我们正在缓存有问题的 IIS 服务器,该服务器有时只发送空响应(0 字节)而不是正确的响应。缓存这些响应将是一场灾难,而且我们无法解决问题,因为它不是我们的服务器。相反,我想指示 Varnish 如果后端的响应为空(0 字节),则不要缓存它们。

阅读VCL参考(https://www.varnish-cache.org/docs/4.0/reference/vcl.html)我看不到任何明显的方法来解决这个问题。

能做到吗?

Tee*_*ebu 6

如果您想将其用作整数来查看是否大于或小于值,请使用 std.

import std; 

if (std.integer(beresp.http.content-length, 0) < 500) {
  #logic here 
}
Run Code Online (Sandbox Code Playgroud)


Hub*_*bro 3

响应的大小应作为 HTTP 标头提供。

示例(中vcl_backend_response):

if (beresp.http.Content-Length == "0") {
    return(retry);   # Retries the request
}
Run Code Online (Sandbox Code Playgroud)

或者:

if (beresp.http.Content-Length == "0") {
    beresp.uncacheable = true;   # Prevents object from being cached
}
Run Code Online (Sandbox Code Playgroud)