Можно ли предотвратить кэширование на основе размера ответа бэкэнда в Varnish?
Мы кэшируем проблемный сервер IIS, который иногда просто отправляет пустые ответы (0 байт) вместо правильных. Кэширование этих ответов было бы катастрофой, и мы не можем решить проблему, поскольку это не наш сервер. Вместо этого я бы хотел проинструктировать Varnish не кэшировать ответы от бэкэнда, если они пусты (0 байт).
Читая ссылку на VCL ( https://www.varnish-cache.org/docs/4.0/reference/vcl.html), я не вижу очевидного способа решения этой проблемы.
Это можно сделать?
2 ответа
Если вы хотите использовать его как целое число, чтобы увидеть значение больше или меньше, используйте std.
import std;
if (std.integer(beresp.http.content-length, 0) < 500) {
#logic here
}
Размер ответа должен быть доступен в виде заголовка HTTP.
Пример (в vcl_backend_response
):
if (beresp.http.Content-Length == "0") {
return(retry); # Retries the request
}
или же:
if (beresp.http.Content-Length == "0") {
beresp.uncacheable = true; # Prevents object from being cached
}